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

标签 c compiler-construction c-preprocessor

这个问题在这里已经有了答案:





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/

相关文章:

c - 使用 gcc 预处理器制作余弦表

c - 我应该如何编写这个通用算法

凯撒密码不解密

c++ - Visual C++ 2012 中的编译器错误? (乱七八糟的跳转地址)

java - 使用标记解析表达式

c - 用于 C 模板仿真的 Doxygen

c++ - Mini Filter 驱动程序与 Windows 服务的通信

c++ - 编译器是否优化了净零位移位?

delphi - 条件表达式在包内是否被破坏?

c++ - 我如何#include 一个名称由宏构建的文件?