【发布时间】:2019-01-10 07:27:40
【问题描述】:
我正在学习如何使用宏函数,现在遇到了一些(很可能是未定义的)行为。这是一个例子:
#include <stdio.h>
#define FOO(a, b) { \
printf("%s%s\n", #a #b); \
} \
int main(int argc, char * argv[]){
{ printf("%s%s\n", 1 2); } //compile error
FOO(1, 2); //prints 12 with some garbage
}
我很可能遇到了 UB,但深入研究 N1570 并没有给出明确的解释。我找到的最接近这个的是5.1.1.2(p4):
执行预处理指令,扩展宏调用, 和 _Pragma 一元运算符表达式被执行。 如果匹配通用字符名称语法的字符序列是 由令牌连接 (6.10.3.3) 产生,行为未定义。
可能标记 "1" "2" 被串联产生 UB,但我不确定。
【问题讨论】:
-
"可能标记 "1" "2" 被连接产生 UB"。这是正确的。对于第一个
%s,您会得到一个自动连接的"12",而对于第二个%s,您将一无所有,因此为什么您会为那个打印垃圾。在#a和#b之间尝试printf("%s%s\n", #a, #b);和,。
标签: c macros printf undefined-behavior