关于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
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10亿数据,如何做迁移?
· 推荐几款开源且免费的 .NET MAUI 组件库
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 易语言 —— 开山篇
· Trae初体验