C语言中的#和##
字符串化#
C 语言中,#
号可用于将宏参数转为字符串,如下:
1 |
|
这种用法有什么使用场景呢?如下,有时候我们需要取得宏函数参数(表达式/变量)的字面内容:
1 |
|
这在某些情况下很有用,比如 assert 宏,参见assert剖析。
另外需要注意,当宏参数是另一个宏的时候,宏定义里有用 #
的地方宏参数不会再展开 ,比如:
1 |
|
如果想要宏参数展开,则需要使用以下两步:
1 |
|
原因是 warn(expr) 展开时会扩展它的参数,即替换 expr 中的宏变量。
符号粘贴##
##
用于拼接两个符号,如下:
1 |
|
注意,从以上结果可见,转换后的结果不是字符串! 而是正常的代码或数字。如果想将结果转为字符串,可以采用如下方式:
1 |
|
Window 下对 ##
的一个简单使用是指定字符编码方式:
1 |
当定义了 _UNICODE
时,则 TEXT("hello")
为 "hello"
,否则为 L"hellp
。
L"str"
是 C/C++ 对宽字节字符的原生支持,表示字符串中的每个字符都是双字节。
另外需要强调的是,#
和 ##
都只能用于预处理宏扩展,不能在普通源码中使用。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 极简!
评论