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 开发人员决定让它也影响编译器。
我一直在研究 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 开发人员决定让它也影响编译器。