这个问题在这里已经有了答案:
Why is #pragma considered a preprocessor directive?
(3 个回答)
8 个月前关闭。
我一直在研究 GCC pragma 类型及其操作。但是我意识到编译指示可以直接用于命令编译。我遇到的困惑是 # 操作是预处理的一部分,例如
#if DEBUG
/* statement one */
#elif RELEASE
/* statement two */
#endif
如果激活 Debug模式,编译器甚至不会编译并检测语句二中的错误,但是#pragma 如何直接向编译器发出命令?另外如果它控制编译器,有没有办法在没有#pragmas 的情况下做到这一点?因为预处理后只剩下C代码了。
最佳答案
is there a way to do it without #pragmas?
不,据我所知。
Because after preprocessing there is only C code left.
事实证明,至少 GCC 和 Clang 不会删除
#pragma
在预处理期间,并将其留给编译器处理。它们似乎也取代了 _Pragma
与 #pragma
.您可以通过使用
-E
调用它们来查看它。输出预处理源的标志。pragmas can be used to command directly compiler. The confusion I am having is that # operations are part of preprocessing
是的,C++ 很奇怪。该标准将其称为“预处理器指令”,但没有定义它可以做什么或不能做什么。 GCC 开发人员决定让它也影响编译器。
关于C#pragma 是预处理还是编译时操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66357244/