现在的位置: 首页 > 综合 > 正文

c语言预处理–宏定义

2013年09月16日 ⁄ 综合 ⁄ 共 820字 ⁄ 字号 评论关闭

  (个人笔记)

宏定义对于用c语言编程的人是经常用,这里只讲使用中需注意的问题点和方便的用法。

 

1.宏扩展中空格对扩展结果的影响

 #define a(y)   
a_expanded(y)

 a(x)被扩展为: a_expanded(x)

#define a 
(y)        a_expanded  (y)   

a(x)
被扩展为: (y)     a_expanded    
(y) (x)

 

2.用宏实现自动注释调试代码

假如用来打印trace的函数为trace(),我们可以宏定义一个自己的函数MY_TRACE

#ifdef DEBUG
#define MY_TRACE trace
#else
#define MY_TRACE /\
/MY_TRACE
/*注意这里/一定要顶格写,否则就不是注释符//了*/
#endif

在没定义DEBUG宏的情况下使用MY_TRACE函数,由于续行符的作用代码展开后会变成注释了。

如MY_TRACE("TEST");展开后变成了//MY_TRACE("TEST");

 

3.宏定义里的注释

#define NUM    1//(2)

在使用NUM的时候替换时是没有注释的。原因是预处理的时候在替换宏之前已经把注释全部替换为空格了。

附上预处理步骤:

      1)三连符替换成相应的单字符,/r/n(windows上)和/n(linux)上通改为换行符

  2)把用/字符续行的多行代码接成一行

  3)把注释(不管是单行注释还是多行注释)都替换成一个空格。

  4)预处理器把逻辑代码行划分成Token和空白字符,

  5)遇到#include预处理指示,则把相应的源文件包含进来,并对源文件做以上1-4步预处理。如果遇到宏定义则做宏展开。

  6)找出字符常量或字符串中的转义序列,用相应的字节来替换它,比如把/n替换成字节0x0a。

  7)把相邻的字符串连接起来。

  8)把Token交给C编译器做语法解析,这时就不再是预处理Token,而称为C Token了。

抱歉!评论已关闭.