头文件和标准预处理器宏问题

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";

posted @   林锅  阅读(382)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示