【发布时间】:2011-04-19 02:47:31
【问题描述】:
我希望能够做类似的事情
#print "C Preprocessor got here!"
用于调试目的。最好/最便携的方法是什么?
【问题讨论】:
我希望能够做类似的事情
#print "C Preprocessor got here!"
用于调试目的。最好/最便携的方法是什么?
【问题讨论】:
warning 指令可能是最接近您的指令,但它并不完全独立于平台:
#warning "C Preprocessor got here!"
AFAIK 这适用于除 MSVC 之外的大多数编译器,您必须在其上使用 pragma 指令:
#pragma message ( "C Preprocessor got here!" )
【讨论】:
#ifdef _LINUX #define #preprocmsg "#warning" else #define #preprocmsg "#pragma message"... 我必须尝试一下,但直觉告诉我答案是否定的。
#define WARNING(msg) _Pragma("message " #msg)
#warning "DEBUG="DEBUG
【讨论】:
-Werror 构建时它也不会失败:gcc.godbolt.org/z/xoK6b8
您不妨试试:#pragma message("Hello World!")
【讨论】:
大多数 C 编译器都会识别 #warning 指令,所以
#warning "Got here"
还有标准的“#error”指令,
#error "Got here"
虽然所有编译器都支持这一点,但它也会停止编译/预处理。
【讨论】:
#pragma message("foo")
效果很好。即使您使用 -Werror 也不会停止编译
【讨论】:
#define 的计算结果。
另一个解决方案是使用 cmets 和一个 shell 脚本来处理它们。这需要一定的纪律(或捕捉拼写错误的 shell 脚本)。
例如,我添加了格式为//TODO 的 cmets,然后添加了一个将所有它们收集到报告中的 shell 脚本。
对于更复杂的用例,您可以尝试编写自己的简单预处理器。例如,您可以将源编辑为 *.c2 文件。简单的预处理器会读取源代码,查找//TODO,并将printf("TODO ...") 写入输出*.c 文件中。
【讨论】:
你不能。预处理器在 C 代码之前处理。没有预处理器指令可以打印到屏幕上,因为预处理器代码没有被执行,它被用来生成将被编译成可执行代码的 C 代码。
有什么问题:
#ifdef ...
printf("Hello");
#endif
因为就预处理器而言,这就是您所能做的一切。
【讨论】: