C宏中的引号导致奇怪的行为

时间:2016-12-13 12:03:17

标签: c macros c-preprocessor

以下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是否再次被破坏,或者我是否在调用某种不圣洁的未定义行为?

0 个答案:

没有答案