#define ZBX_FS_UI64 "%I64u"
uint64_t a;
sscanf(line, "%*s " ZBX_FS_UI64 " ",&a);
上面的代码通过sscanf
从line里面取出一个64位无符号整型,我的问题是ZBX_FS_UI64
这个宏展开以后是:
sscanf(line, "%*s " "%I64u" " ",&a);
我想问这样的语法为什么是正确的,format难道不应该是一个完整的字符串常量?这里的字符串常量是不是被预处理器拼接起来了?
这只是宏的一种转义写法,
试想如果在字符串中直接使用宏 "%*s ZBX_FS_UI64 "
那必然带来歧义,这个字符串里到底就这ZBX_FS_UI64
还是应该用宏来替换呢。
而 "%*s " ZBX_FS_UI64 " "
这种形式就是用来正确的在字符串中引用宏的,这时候替换结果就是"%*s %I64u"
,而并不是编译器再做了拼接。
C语言标准就是如此,多个字符串常量写一起相当于连起来,比如"foo""bar"
和"foo" "bar"
都等于"foobar"