以下C程序尝试进行字符串化,然后打印两个类似对象的宏的扩展:
#include <stdio.h>
#define FOOBAR foobar // I'll be gone soon :(
#define UNHOLY \" // I'm in your strings
#define STR_(X) #X
#define STR(X) STR_(X)
int main() {
printf("%s\n", STR(FOOBAR));
printf("%s\n", STR(UNHOLY));
return 0;
}
使用GCC和Clang编译时,FOOBAR
的字符串化会产生预期的结果。但是,UNHOLY
设法以某种方式保留注释,最终在字符串中。据我所知,在预处理程序运行之前很久就会删除注释,因此我只能得出结论,这是一个词法分析器问题。
VC甚至不会编译它。它因错误而失败:escaped '"': is illegal in macro definition
。我是否可以简单地删除注释并假设它符合预期(即第二次打印应该生成"
)在兼容的C编译器中? VC是否再次被破坏,或者我是否在调用某种不圣洁的未定义行为?