C#pragma是预处理还是编译时操作?

Emr*_*riş 5 c compiler-construction c-preprocessor

我一直在研究 GCC 编译指示类型及其操作。但我意识到pragmas可以用来直接编译命令。我遇到的困惑是 # 操作是预处理的一部分,例如

#if DEBUG
 /* statement one */
#elif RELEASE
 /* statement two */
#endif
Run Code Online (Sandbox Code Playgroud)

如果激活调试模式,编译器甚至不会编译和检测语句二中的错误,但是#pragma如何直接向编译器发出命令?

另外,如果它控制编译器,有没有办法在没有#pragmas的情况下做到这一点?因为预处理之后只剩下C代码了。

Hol*_*Cat 4

有没有办法在没有#pragmas的情况下做到这一点?

不,据我所知。

因为预处理之后只剩下C代码了。

事实证明,至少 GCC 和 Clang#pragma在预处理期间不会删除它,而是将其留给编译器来处理。它们似乎也替换_Pragma#pragma.

您可以通过使用-E标志调用它们来输出预处理的源代码来查看它。

pragmas 可用于直接编译命令。我感到困惑的是 # 操作是预处理的一部分

是的,C++ 很奇怪。该标准将其称为“预处理器指令”,但没有定义它可以做什么或不能做什么。GCC 开发人员决定让它也影响编译器。