/*
#define FOO
*/
#ifdef FOO
#define BAR "pirate"
#else
#define BAR "ninja"
#endif
int main() { printf(BAR); getchar(); }
在此代码中未定义FOO(Visual Studio 2008)。我假设评论首先被处理,然后是预处理器,然后是代码。预处理器之前是否处理了注释?这是标准的一部分吗?评论总是在预处理器之前处理?
/*
#define FOO
*/
#ifdef FOO
#define BAR "pirate"
#else
#define BAR "ninja"
#endif
int main() { printf(BAR); getchar(); }
在此代码中未定义FOO(Visual Studio 2008)。我假设评论首先被处理,然后是预处理器,然后是代码。预处理器之前是否处理了注释?这是标准的一部分吗?评论总是在预处理器之前处理?
我假设先处理注释,然后是预处理器,然后是代码。预处理器之前是否处理了注释?
排序 - 预处理器作业的一部分是删除注释。在这种情况下,它并不在意你在评论中有指示;它仍然像其他评论一样被删除。
是的(在每一个理智的宇宙中)。
一些快速研究表明注释转换为空白由预处理器。所以,这都是同一流程的一部分。
根据Wikipedia,注释在预处理器指令之前处理。
是的,从语言标准的角度来看,预处理器开始工作之前,处理注释(用空格替换)。
在实际实现中,注释处理可以由一个处理预处理指令,并执行宏替换相同的代码(例如,相同的可执行文件)来进行,但结果必须是相同的:评价对预处理适当没有影响。
在老年人和/或非标准的代码,有时一个可能会看到一些技巧,依赖于涉及具体实现的评论与预处理的关系,等等,例如,评论创建使用预处理指令不规范的行为
#define CONCAT(a, b) a##b
#define BEGIN_COMMENT CONCAT(/, *)
#define END_COMMENT CONCAT(*, /)
BEGIN_COMMENT
This code is supposedly commented-out
END_COMMENT
或使用预处理级级联的意见(C编译器是不支持的宏定义##
运营商)这样的招数
#define OLD_CONCAT(a, b) a/**/b
都不是在standa法律C.他们都没有真正的工作。
根据C标准,在程序的翻译(编译)期间有8个翻译阶段。每个注释在翻译阶段3中被空白字符替代,而预处理指令在阶段4中被执行。
是的,预处理器在处理指令之前替换注释。
从节5.1.1.2 C99标准(翻译相):
3)源文件被分解成预处理标记和空白字符(包括注释序列)....每个注释被一个空格字符替换....
4)预处理指令被执行,宏调用被扩展,....