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

问题描述 投票:0回答:2

我被告知GCC中的

#pragma omp
指令是编译器的指令,而不是预处理器的指令。

正确吗?

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

c++ gcc openmp c-preprocessor
2个回答
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
尚未处理。


4
投票

这是来自gcc文档的引用

本手册记录了对预处理器本身有意义的编译指示。其他编译指示对 C 或 C++ 编译器有意义。它们记录在 GCC 手册中。

据此,有预处理器编译指示和非预处理器编译指示。

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

预处理器指令在 C 标准中指定,编译器指令在编译器手册中描述。

关于您的编辑,链接页面没有提及

#pragma omp
,如果您将其与上面的引用结合起来,我会推断该编译指示不适用于预处理器。这绝对是编译器特定的。

© www.soinside.com 2019 - 2024. All rights reserved.