_STR(x)和_VAL(x)用一个不行吗?为什么用了_VAL(x)还要用_STR(x)代替?
因为存在多次宏替换(__LINE__也是宏),定义一个宏与定义两个宏效果是不一样的。如果想理解底层宏替换的细节,只要在gcc编译选项中增加-E,即只进行预处理,这样就可以看到预处理(宏替换)之后的结果。
__LINE__
可以试试看只定义一个宏和定义两个宏得到的结果有什么不同
你试试只用一个宏就知道了。LINE也是个宏,通过一个中间宏,LINE才能来得及展开