【发布时间】:2019-06-21 10:05:38
【问题描述】:
我试图理解预处理器。
为什么下面的预处理器宏中的一个不起作用,而另一个却起作用
#pragma 和 _Pragma 有什么区别
为什么我们要用 ASTRINGZ 包裹 STRINGZ?
#define STRINGZ(x) #x
#define ASTRINGZ(x) STRINGZ(x)
#define DO_PRAGMA(x) _Pragma (#x)
#define TODO(x) DO_PRAGMA(message ("TODO - " #x))
#define msg(s) TODO( s " - @ - " ASTRINGZ(__FILE__))
msg ("This doesnt work")
#pragma message "but this does: " ASTRINGZ(__FILE__)
来源:
https://gcc.gnu.org/onlinedocs/gcc/Diagnostic-Pragmas.html
http://forums.codeguru.com/showthread.php?215151-LINE-MACRO-to-string-literal&p=613574#post613574
【问题讨论】:
-
我猜
#pragma来自VC -
@Mayur
#pragma是非标准 C 的标准 C :)#pragma之后的内容将是特定于编译器的,需要不识别它的编译器忽略它。无论如何,这不是问题所在,而是宏参数的预处理器扩展。 -
@StoryTeller 更好的欺骗? stackoverflow.com/questions/16989730/…
-
@StoryTeller 好吧,也许这个问题已经足够具体了。我会重新打开。并且还交换了 wiki 中的规范欺骗,因为我同意我使用的第一个没有很好的答案。
-
@Hasan alattar 关于
#pragma和_Pragma的区别,前者是预处理器指令,后者是在其他预处理器指令中使用的运算符。两者都是标准 C 并用于可移植地指示以下内容不是标准 C。
标签: c compilation c-preprocessor pragma