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