我被告知GCC中的#pragma omp
指令是编译器的指令,并不是预处理器的指令。
这是对的吗?
如何区分预处理程序和编译器的指令?
答案 0 :(得分: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
则没有。{/ p>
答案 1 :(得分:4)
以下是gcc docs
的引用本手册记录了对预处理器本身有意义的编译指示。其他编译指示对C或C ++编译器有意义。它们记录在GCC手册中。
据此,有预处理程序编译指示和非预处理程序编译指示。
如何区分预处理程序和编译器的指令?
预处理程序指令在C标准中指定,编译器指令在编译器手册中描述。
关于您的编辑,链接页面没有提及#pragma omp
,如果您将其与上面的引用结合起来,我会推断该编译指示不适用于预处理器。它绝对是特定于编译器的。