特殊宏

__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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值