使用C/C++编译预处理时需要注意的问题(宏相关问题)

使用C/C++编译预处理时需要注意的问题


1、宏定义不是C/C++语句,不需要使用语句结束符“;”,否则它也被看做宏体的一部分。


2、不要在引用宏定义的参数列表中使用增量和减量运算符,否则将导致变量的多次求值。例如:

  1. #define SQUARE(x) ((x) * (x))  
  2. int n1 = 5;  
  3. int m1 = SQUARE(n1++);          //m1 = 25,n1 = 7  
  4.   
  5. int n2 = 5;  
  6. int m2 = SQUARE(++n2);          //m2 = 49,n2 = 7  

3、带参数的宏体和各个形参应分别用括号括起来,以免造成意想不到的错误。例如:

  1. #define SQUARE(x) x * x  
  2. int m = SQUARE(3 + 5);          //将被扩展为m = 3 + 5 * 3 + 5  

4、当不再使用某一个宏时,可以使用#undef来取消其定义,否则简单地删除宏定义会带来许多编译错误。


5、编译伪指令#error用于输出与平台、环境等有关的信息。例如:

  1. #if !defined(WIN32)  
  2. #error ERROR: Only Win32 Platform supported!  
  3. #endif  
  4. #ifndef _cplusplus  
  5. #error ERROR: MFC requires C++ compilation!  
  6. #endif  

当预处理器发现应用程序中没有定义宏WIN32或者cplusplus时,把#error后面的字符序列输出到屏幕后即终止,程序不会进入编译阶段。


6、当需要暂时放弃一段代码的时候,如果这段代码本身就含有块注释时,使用块注释屏蔽它就比较麻烦,此时可使用条件编译伪指令#if来屏蔽这段代码。例如:

  1. #if 0  
  2. //希望屏蔽的代码  
  3. #endif  

注意:由于条件编译由编译预处理器来处理,显然预编译伪指令无法计算有变量参与其中的表达式或sizeof表达式,只能用常量表达式。


7、编译伪指令#pragma用于执行语言实现所定义的动作,例如:

  1. #pragma pack(push, 8)       /*对象成员对齐字节数*/  
  2. #pragma pack(pop)  
  3. #pragma warning(disable:4069)   /*不要产生第C4096号编译警告*/  

8、构串操作符#只能修饰带参数的宏的形参,它将实参的字符序列(而不是实参代表的值)转换成字符串常量。例如:

  1. #define STRING(s)   #s #s #s  
  2. #define TEXT(s)     "class" #s "Infor"  
  3. int abc = 100;  
  4. STRING(abc)         //展开为abcabcabc  
  5. TEXT(abc)           //展开为classabcInfor  

注意:无论#s之间有多少个空格展开后都将忽略。


9、合并操作符##将出现在其左右的字符序列合并成一个新的标识符(注意,不是字符串)。例如:

  1. #include <stdio.h>  
  2. #define paster( n ) printf( "token"#n" = %d\n", token##n )  
  3.   
  4. int main(void)  
  5. {  
  6.     int token9 = 100;  
  7.     paster(9);          //输出token9 = 100  
  8.   
  9.     return 0;  
  10. }  

注意:(1)C语言字符串中的两个相连的双引号会被自动忽略;(2)使用合并操作符时,产生的标识符必须预先有定义,否则编译器会报“标识符未定义”的编译错误。


参考:

屏蔽 宏 c++  谷歌

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值