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

How to distinguish preprocessor and compiler directives?

本文关键字:指令 编译器 处理器 预处理 何区      更新时间:2023-10-16

我被告知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文档的引用

本手册记录了对预处理器本身有意义的pragmas。其他的程序对C或c++编译器是有意义的。它们在GCC手册中有文档。

按此分为预处理器pragmas和非预处理器pragmas。

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

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

关于你的编辑,链接的页面没有提到#pragma omp,如果你把它和上面的引用结合起来,我认为这个pragma不是针对预处理器的。