考虑这个(可怕的,可怕的,没有好的,非常糟糕的)代码结构:
#define foo(x) // commented out debugging code
// Misformatted to not obscure the point
if (a)
foo(a);
bar(a);
Run Code Online (Sandbox Code Playgroud)
我已经看到两个编译器的预处理器在这段代码上生成不同的结果:
if (a)
bar(a);
Run Code Online (Sandbox Code Playgroud)
和
if (a)
;
bar(a);
Run Code Online (Sandbox Code Playgroud)
显然,对于可移植的代码库来说这是一件坏事.
我的问题:预处理器应该用这个做什么?首先是Elide评论,还是先扩展宏?
/*
#define FOO
*/
#ifdef FOO
#define BAR "pirate"
#else
#define BAR "ninja"
#endif
int main() { printf(BAR); getchar(); }
Run Code Online (Sandbox Code Playgroud)
在此代码中,未定义FOO(Visual Studio 2008).我假设首先处理注释,然后是预处理器,然后是代码.是否始终在预处理器之前处理注释?这是标准的一部分吗?