是否有可移植的方式从C预处理器打印消息?

And*_*ner 85 printing c-preprocessor

我希望能够做类似的事情

#print "C Preprocessor got here!"
Run Code Online (Sandbox Code Playgroud)

用于调试目的.什么是最好/最便携的方式?

You*_*You 101

warning指令可能是您最接近的指令,但它不完全与平台无关:

#warning "C Preprocessor got here!"
Run Code Online (Sandbox Code Playgroud)

AFAIK适用于除MSVC之外的大多数编译器,您必须使用该pragma指令:

#pragma message ( "C Preprocessor got here!" )
Run Code Online (Sandbox Code Playgroud)

  • @Bryan:是的.`#define WARNING(msg)_Pragma("message"#msg)` (10认同)
  • 这引出了一个问题,您是否可以根据编译标志放置指令以某种方式交换"pragma message"和"warning"?例如,是这样的:`#ifdef来_LINUX的#define #preprocmsg"#warning后"别人的#define #preprocmsg"的#pragma消息"`...我不得不尝试,但直觉告诉我的答案是否定的. (5认同)
  • 当您的项目默认使用-Wall编译时,发出警告非常不方便.#pragma message没有这个问题. (5认同)

Mat*_*ner 47

MSVCGCC支持以下内容.

#pragma message("stuff")
#pragma message "stuff"
Run Code Online (Sandbox Code Playgroud)

Clang最近开始增加支持,请点击此处了解更多信息.

  • 只是为了记录,Solaris Studio 12.3 (Sun C 5.12) 不支持此编译指示。 (3认同)

Rue*_*uel 11

您可能想尝试: #pragma message("Hello World!")


nos*_*nos 8

大多数C编译器都会识别一个#warning指令,所以

 #warning "Got here"
Run Code Online (Sandbox Code Playgroud)

还有标准的'#error'指令,

 #error "Got here"
Run Code Online (Sandbox Code Playgroud)

虽然所有编译器都支持它,但它也会停止编译/预处理.


Mar*_*tin 6

#pragma message("foo")
Run Code Online (Sandbox Code Playgroud)

效果很好.即使你使用-Werror也不会停止编译