关于C++的编译和链接的细节

        首先是关于c++和c的区分,编译器会将他们的扩展名.cpp或是.c来区分这是cpp文件还是c文件。

        其次就是c++的运行分为编译和链接两个过程,任何的cpp文件会生成obj目标文件对应一个编译单元,obj是代码输出的内容,可以是二进制机器码,也可能是汇编,这些都用编译器设置输出内容决定,链接过程则会把obj(目标文件)进行链接成一个exe的可执行文件。

        编译是compile,cpp文件都可以进行编译,编译不一定需要有main函数,main函数通常只做完程序的主入口地址,实际上我们一般都这么做,但是程序的入口地址不一定飞得是main函数。当试着运行c++的工程或者是build该c++工程时则会执行编译和链接两个过程,一个过程出错都会报错。

        好在VS编译器给编译和链接的错误都编了号,链接错误为LXXX ,编译错误为CXXXX,这是VS编译器的特性,其他编译器如clang就没有这种特性。

        当在程序的入口地址,比如main函数,写的代码是正确的,而其他地方的代码(比如函数,这里说的函数是单纯的只带返回类型和函数参数的那种)有错误但main函数程序并没有调用,链接会报错,因为从技术上说,编译器会认为你在本cpp文件未调用,但可能会在其他文件调用,可以通过告诉编译器这个函数我只在本文件使用,则可以去掉这种链接的必然性,用static关键词修饰函数,被声明只在这个cpp文件中作用。(和C中static的作用域一致)

如果本cpp文件的函数只在本文件调用,则定义函数用static修饰,如下

static int add(){

return 3+5;

}

include则是CV,单纯的复制和张贴,需要注意函数会不会重定义的问题而报链接错误,编译器找不到应该链接的函数(前提是你在头文件里写函数而不是声明),以前则会用#ifndef #endif去只加载一次这些头文件的代码,现代C++则可以用#pragma once只加载一次头文件代码

#ifndef __SYS_H_

#define __SYS_H_



#endif

//或者是

#pragma once

posted @   昊月光华  阅读(7)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 10亿数据,如何做迁移?
· 推荐几款开源且免费的 .NET MAUI 组件库
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 易语言 —— 开山篇
· Trae初体验
点击右上角即可分享
微信分享提示