klm*_*123 2 c++ compiler-construction gcc openmp c-preprocessor
我被告知#pragma ompGCC中的指令是编译器的指令,并不是预处理器的指令.
这是对的吗?
如何区分预处理程序和编译器的指令?
gcc -E仅运行预处理器.因此检查输出:剩下的任何东西都是为了让编译器正确注意.
有了一些C++经验,你不需要每次都这样做,因为你将了解预处理器的作用以及编译器的作用.一些控制的东西#pragma不可能由预处理器来完成,因此在这种情况下它必须是编译器指令(或者理论上它可以被预处理器替换为等效的编译器指令 - 如果你关心的话然后再次区别,gcc -E将显示会发生什么).但是,有些事情#pragma与预处理(#pragma once)有关,因此在这些情况下它必须是预处理程序指令.
您的示例#pragma omp是两个测试的编译器指令.根据一般知识,预处理器并不像智能足以并行化代码.它甚至不了解它看到的大多数C++代码,基本上所能做的就是使用常量,宏替换和铲除文本的整数运算.要进行直接测试,请gcc -E尝试以下文件:
#if 1
#pragma omp
#endif
Run Code Online (Sandbox Code Playgroud)
输出是一些文件名/行号注释加:
#pragma omp
Run Code Online (Sandbox Code Playgroud)
所以我们观察到#if并且#endif已经由预处理器处理,而#pragma omp没有.