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"

  • CSAPP打印程序对象的字节表示问题?
  • C Primer Plus中为什么说0XAA的数据类型是unsigned int呢?
  • 为什么tcp 协议下中的connect虽然也会阻塞,但是被信号中断时不能立刻重试
  • 判断一个句柄【open时】是w+还是a+
  • 有关数组[]的问题
  • 如何找出有向图中的所有环
  • ODP.net连接oracle出错解决
  • 不同类型的常量指针指向非常量对象时,为什么不行,引用却可以?
  • c++连续赋值问题
  • socket连接被重置是什么原因 ?
  • C语言或OC或C++ 中英文混合的文件读取前3个字符怎么做?