2014-06-06 116 views

回答

4

这里是gcc docs

报价本手册记录这是有意义的预处理器本身的编译指示。其他编译指示对C或C++编译器有意义。它们记录在GCC手册中。

据此,有预处理器编译指示和非预处理编译指示。

如何区分预处理器和编译器的指令?

预处理器指令在C标准中指定,编译器指令在编译器手册中有描述。

关于你的编辑,链接页面没有提到#pragma omp,如果你将它与上面的引用结合起来,我会推断该编译指示不适用于预处理器。这绝对是编译器特有的。

5

gcc -E只运行预处理器。因此,检查一下输出:留在那里的任何东西都是编译器的注意力。

有了C++的一些经验,您不需要每次都这样做,因为您将了解预处理器的功能以及编译器的功能。由#pragma控制的一些事情不可能由预处理器完成,所以在这种情况下它必须是编译器指令(或者理论上它可以被预处理器替换为等效的编译器指令 - 如果你关心的话然后差异再次,gcc -E将显示发生了什么)。然而,#pragma中的一些与预处理(#pragma once)有关,因此在这些情况下它必须是预处理器指令。

您的示例#pragma omp是两个测试的编译器指令。根据一般知识,预处理器并不像代码那样足够聪明。它甚至不理解大多数它看到的C++代码,基本上它可以做的只有整数运算,包括常量,宏替换和铲除文本。对于gcc -E直接测试请尝试以下文件:

#if 1 
    #pragma omp 
#endif 

输出是一些文件名/行号注释加:

#pragma omp 

所以我们观察到#if#endif已通过预处理器处理,而#pragma omp还没有。

+0

我指定了问题。这句话是关于杂注omp。 – klm123

+0

@ klm123你选择了添加omp的问题......他的回答是在编辑之前完成的。批评他是不正确的......在他回答的时候,你没有**关于杂注omp的一句话。 – mah

+0

@mah,我是否批评?我通知。 – klm123