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

时间:2014-06-06 10:23:58

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

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

这是对的吗?

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

2 个答案:

答案 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,如果您将其与上面的引用结合起来,我会推断该编译指示不适用于预处理器。它绝对是特定于编译器的。