2010-01-05 85 views
4
/* 
#define FOO 
*/ 

#ifdef FOO 
#define BAR "pirate" 
#else 
#define BAR "ninja" 
#endif 

int main() { printf(BAR); getchar(); } 

在此代码中未定义FOO(Visual Studio 2008)。我假设评论首先被处理,然后是预处理器,然后是代码。预处理器之前是否处理了注释?这是标准的一部分吗?评论总是在预处理器之前处理?

回答

9

我假设先处理注释,然后是预处理器,然后是代码。预处理器之前是否处理了注释?

排序 - 预处理器作业的一部分删除注释。在这种情况下,它并不在意你在评论中有指示;它仍然像其他评论一样被删除。

2

是的(在每一个理智的宇宙中)。

3

一些快速研究表明注释转换为空白预处理器。所以,这都是同一流程的一部分。

根据Wikipedia,注释在预处理器指令之前处理。

4

是的,从语言标准的角度来看,预处理器开始工作之前,处理注释(用空格替换)

在实际实现中,注释处理可以由一个处理预处理指令,并执行宏替换相同的代码(例如,相同的可执行文件)来进行,但结果必须是相同的:评价对预处理适当没有影响。

在老年人和/或非标准的代码,有时一个可能会看到一些技巧,依赖于涉及具体实现的评论与预处理的关系,等等,例如,评论创建使用预处理指令不规范的行为

#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.他们都没有真正的工作。

10

根据C标准,在程序的翻译(编译)期间有8个翻译阶段。每个注释在翻译阶段3中被空白字符替代,而预处理指令在阶段4中被执行。

7

是的,预处理器在处理指令之前替换注释。

从节5.1.1.2 C99标准(翻译相):

3)源文件被分解成预处理标记和空白字符(包括注释序列)....每个注释被一个空格字符替换....

4)预处理指令被执行,宏调用被扩展,....