[英]How to enable GCC compiler flags via preprocessor directives, rather than command line options?
[英]How to distinguish preprocessor and compiler directives?
我被告知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 docs的引用
本手册记录了对预处理器本身有意义的编译指示。 其他编译指示对C或C ++编译器有意义。 它们记录在GCC手册中。
据此,有预处理程序编译指示和非预处理程序编译指示。
如何区分预处理程序和编译器的指令?
预处理程序指令在C标准中指定,编译器指令在编译器手册中描述。
关于你的编辑,链接的页面没有提到#pragma omp
,如果你把它与上面的引用结合起来,我会推断pragma不适用于预处理器。 它肯定是编译器特定的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.