欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

特殊宏

程序员文章站 2022-05-05 09:03:57
...

__cplusplus

  • 当C++和C差别足够大时,编译器为了区分C++和C,会自主判断是否携带该宏,编译器认为是C++语言时会携带该宏,认为是C语言时则不会携带。
  • 在C和C++混合开发时为了兼容C,我们也会根据该宏做相应处理。

编译器判断测试

  • 测试命令与结果:
gcc test.c  //编译后不带 __cplusplus 宏
gcc test.cpp //编译后带 __cplusplus 宏
gcc test.C //编译后带 __cplusplus 宏
g++ test.c //编译后带 __cplusplus 宏
g++ test.cpp //编译后带 __cplusplus 宏
g++ test.C //编译后带 __cplusplus 宏
  • 使用g++编译,由于c++兼容c,不管是编译.c或.cpp,都会带 __cplusplus 宏,
  • 使用gcc编译,除非是.c,其它后缀都会带 __cplusplus 宏

混合开发兼容例子

#ifdef __cplusplus
std::cout << "using C++" << std::endl;
#else
printf("using C\n");
#endif

__FILE__和__LINE__

  • 在代码中可以通过__FILE__宏获取代码文件名和 __LINE__宏获取当前代码行号,例如:
printf("Current File %s: line %d\n", __FILE__, __LINE__);

小问题

  1. 使用__FILE__ 宏来调试代码时,有时候打印出来的路径并不是自己想要的,有时候会打印全路径,有时只会打印单个文件名,如果想要打印相对于project路径的相对路径,需要注意。
  2. 打印出来的__LINE__值和实际代码行不匹配。

原理

  • __FILE__宏是在编译时确定的, 不同编译命令打印结果也是不同的,例如:
gcc -c test.c 
打印结果: __FILE__: test.c 
gcc -c /root/test.c 
打印结果: __FILE__: /root/test.c
  • 打印出来的__LINE__值和实际代码行不匹配是因为__LINE__是预处理器替换后的值,因此如果前面的代码有其它宏需要展开,展开后__LINE__就和实际的值不匹配了。

手动修改

  • 可以手动修改这两个宏的值来解决一些问题,例如:去掉文件名的完整路径
#line 1 "Filename.c"
  • 也可以单独修改__LINE__宏的值,例如:
#line 100
相关标签: # 预处理

推荐阅读