繁体   English   中英

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

[英]How to distinguish preprocessor and compiler directives?

我被告知GCC中的#pragma omp指令是编译器的指令,并不是预处理器的指令。

这是正确的吗?

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

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则没有。

这是gcc docs的引用

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM