在#else 预处理器指令后注释

Comment after #else preprocessor directive

这是一段简单的 C 代码,令我惊讶的是它编译成功(至少在我使用的 Visual Studio 2012 中)

#include <stdio.h>

#define MYCONSTANT

int main(int argc, char* argv[])
{
    #ifdef MYCONSTANT // We can write anything here as comment
        printf("MYCONSTANT is defined");
    #else We can write any random words here without marking it as comment
        printf("MYCONSTANT is not defined");
    #endif

    return 0;
}

问题:在 #else 之后可以这样写吗?

在标准 C 中,不允许#else#endif 之后的行中放置注释以外的任何内容。使用我计算机上的编译器,默认情况下我会从您的代码中收到警告:

test.c: In function ‘main’:
test.c:9:11: warning: extra tokens at end of #else directive [-Wendif-labels]
     #else We can write any random words here without marking it as comment
           ^~

如果我要求严格遵守 C99,这将成为一个硬错误。

然而,原始的 "K&R" C 预处理器 did 允许任意文本出现在 #else#endif 之后的行上,而旧的程序会使用它。您的编译器正在 backward-compatible 并允许那些旧程序编译而不会出错。

许多 C 编译器默认允许许多现在被认为是不良风格或完全错误的东西,以允许旧代码继续工作。查看 Visual Studio 的手册,看看是否有推荐的配置可用于新程序。我自己不使用 VS,所以无法给出更具体的建议。