首页 > C语言sscanf等函数的format为什么可以写多个字符串常量

C语言sscanf等函数的format为什么可以写多个字符串常量

#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"

【热门文章】
【热门文章】