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

标签 c++ gcc compiler-construction c-preprocessor openmp

我听说 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/

相关文章:

c++ - 与 ‘operator<<’ 不匹配(可能是因为我的 c++/gcc 版本?)

将 ascii 十六进制字符串转换为字节数组

c++ - 结构成员对齐 - 是否可以假设没有填充

c++ - 如何解决 Visual Studio 编译器崩溃

c++重复箭头运算符取消引用性能与点运算符

c++ - 无法将 QML 组合框信号连接到 C++ 插槽

c++ - 类型检查 : see if a variable is inherited or is a certain class

c++ - 我们如何从 select() 函数中获取套接字列表?

c# - 静态字段初始化在 C# 中如何工作?

compiler-construction - 尝试让 CUDA 工作,示例找不到 helper_cuda.h