C#pragma是预处理还是编译时运行?

C #pragma is preprocess or compile time operation?

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

#if DEBUG
 /* statement one */
#elif RELEASE
 /* statement two */
#endif

如果开启debug模式,编译器连语句二的错误都不编译检测,但是#pragma怎么直接命令编译器呢?

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

#pragmas 是编译器扩展,它们的行为由编译器定义。它们以 # 开头,就像预处理器指令一样,但它们不是其中之一。一些编译器有其他扩展,如 gcc __attribute__ 也可以设置编译器如何编译源代码并生成输出。

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++ 很奇怪。该标准称它为 'preprocessor directive',但没有定义它能做什么或不能做什么。 GCC 开发人员决定让它也影响编译器。