我听说 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
还没有。
关于c++ - 如何区分预处理器和编译器指令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24079555/