头文件和标准预处理器宏问题
1、C++对C库头文件的使用
C++在使用C库的头文件时,可以直接使用,如:#include <assert.h>,或者在头文件名前加上 C 并去掉后缀.h,如:#include <cassert>。
如果直接使用 #include <assert.h> 时,则可以在程序文本中直接使用 assert() 函数,并不需要声明 using namespace std ,或者使用std::assert();但是使用 #include <cassert> 这种格式时,则必须使用上面的格式。
2、C++标准的预处理器宏
如果编译器在编译cpp文件,那么 __cplusplus(前面有两个下划线,后面一样) 就会被定义;如果是一个c文件在被编译,那么__STDC__就会被定义。 __STDC__是预定义宏,当它被定义后,编译器将按照ansic标准来编译你的c程序。
因为C++编译器需要支持函数的重载,会改变函数的名称,因此dll的导出函数通常是标准C定义的。这就使得C和C++的互相调用变得很常见,但是有时又会直接使用C来调用,不想重新写代码,让标准C编写的dll函数定义在C和C++编译器下都能编译通过,通常会使用以下的格式:
#ifdef __cplusplus
extern "C" { }
#endif
下面解释一下上面的代码:
首先,__cpluscplus是C++编译器内部定义的宏,如果使用C编译器,__cplusplus宏不会被定义。它可以作为区分使用的是C编译器还是C++编译器的标志。在标准C中,C代码直接写就可以了;而在C++中,需要加 extern "C" 或包含在 extern "C" 块中。由于标准C是不支持 extern "C" 的,会产生编译错误,所以使用预编译指令通过__cplusplus来判断只有在使用C++编译器时才定义 extern "C"。
ANSIC标准定义了以下6种可供C语言使用的预定义宏:
__LINE__ 在源代码中插入当前源代码行号
__FILE__ 在源代码中插入当前源代码文件名
__DATE__ 在源代码中插入当前编译日期〔注意和当前系统日期区别开来〕
__TIME__ 在源代码中插入当前编译时间〔注意和当前系统时间区别开来〕
__STDC__ 当要求程序严格遵循ANSIC标准时该标识符被赋值为1.
__cplusplus
标识符__LINE__和__FILE__通常用来调试程序;
标识符__DATE__和__TIME__通常用来在编译后的程序中加入一个时间标志,以区分程序的不同版本;
当要求程序严格遵循ANSIC标准时,标识符__STDC__就会被赋值为1;
当用C++编译程序编译时,标识符__cplusplus就会被定义.
另外, C99新增了 __func__ 指示被编译的函数的名字,对于gcc,与__func__等价的名字为 __FUNCTION__ 。上述预定义的名字对写trace有很大的帮助,比如:
if (i==0)
cerr<<"error:"<<__FILE__<<":line:"<<__LINE<<":func"<<__func__<<"i must be non-zero/n";
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现