有没有一种可移植的方式从C预处理器打印消息?


99

我希望能够做类似的事情

#print "C Preprocessor got here!"

用于调试目的。什么是最好/最便携的方法来做到这一点?

Answers:


114

warning指令可能是最接近您的指令,但是它并不完全独立于平台:

#warning "C Preprocessor got here!"

AFAIK可以在除MSVC之外的大多数编译器上使用,您必须在其上使用pragma指令:

#pragma message ( "C Preprocessor got here!" )

5
哪个提出了问题,您是否可以根据编译标志放置指令以某种方式交换“编译指示”和“警告”?例如,类似:#ifdef _LINUX #define #preprocmsg "#warning" else #define #preprocmsg "#pragma message"...我将不得不尝试,但本能告诉我答案是否定的。
Bryan 2010年

11
@布莱恩:是的。#define WARNING(msg) _Pragma("message " #msg)
马特·乔纳

1
较旧版本的gcc(例如gcc 4.1.2,RHEL5上的默认版本)不支持#pragma message()。我还没有找到适合这些较早版本的等效项-警告不会很好,因为警告通常被视为对我们来说是错误,所以我们真的希望该消息具有参考意义,而不是停止编译。
Danny S

6
默认情况下,使用-Wall编译项目时,发出警告非常不便。#pragma消息没有这个问题。
Renan Gemignani

56

MSVCGCC支持以下内容。

#pragma message("stuff")
#pragma message "stuff"

Clang最近开始增加支持,请参见此处


3
仅作记录,Solaris Studio 12.3(Sun C 5.12)不支持此编译指示。
maxschlepzig

使用Visual Studio vMicro与Arduino 1.8配合使用。谢谢!
save_jeff

12

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


9

大多数C编译器都会识别#warning指令,因此

 #warning "Got here"

还有一个标准的“ #error”指令,

 #error "Got here"

尽管所有编译器都支持它,但它也将停止编译/预处理。


6
#pragma message("foo")

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


0

另一个解决方案是使用注释加上外壳脚本来处理它们。这需要一定的纪律(或捕获错别字的shell脚本)。

例如,我添加格式化的注释//TODO,然后添加一个外壳脚本,该脚本将所有注释收集到报表中。

对于更复杂的用例,您可以尝试编写自己的简单预处理器。例如,您可以将源编辑为*.c2文件。简单的预处理器将读取源代码,查找//TODO并将其写入printf("TODO ...")输出*.c文件。


-17

你不能 预处理程序在C代码之前进行处理。没有预处理器指令可打印到屏幕上,因为未执行预处理器代码,它用于生成将被编译为可执行代码的C代码。

出现任何问题:

#ifdef ...
printf("Hello");
#endif

因为这是预处理器所能做的一切。


5
这不会在编译时显示,这就是我在想OP所寻找的。
鲍勃·考夫曼

我以为他是要在运行时打印。
Alexander Rafferty

1
我在问编译时间。谢谢!
Andrew Wagner
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.