因为以前写的代码更多的是Java的代碼很少接触C或者C++语言,最近在阅读一个项目的C语言源代码的时候
感觉到自己相当缺乏C语言的基础知识,于是给自己下了要好好学习一丅C语言的指令再于是,现在在学习《一站式学习C编程》这一本书
在看到P310页关于宏展开的时候,有一个问题困扰了我一下现在把他记錄下来,以便自己以后的复习
这是一个关于assert.h的自定义实现。
省略条件判断条件成立的说明
问题:请结合前面讲过的宏展开步骤思考一丅,为什么不直接定义#define _STR(x) #x呢?
原因:C语言的宏展开有一条规则:除了带#和##运算符的参数之外其他参数在替换之前要对实参本身做充分的展开。
因此如果直接定义为#define _STR(x) #x的话在展开的时候__LINE__直接被当成“__LINE__”了,而无法得到当前的行号“33”
而如上定义的话,根据前面所说的C语言宏展開的规则会对编译器定义的特殊的宏__LINE__作充分的展开得到其表示的含义——行号“33”后,
再传给_VAL(x)进一步展开从而才能得到正确的结果。