Is there a portable way to print a message from the C preprocessor?
我希望能够做类似
的事情
1
| #print"C Preprocessor got here!" |
用于调试目的。最好/最便携的方法是什么?
warning 指令可能是最接近您的指令,但它并不完全独立于平台:
1
| #warning"C Preprocessor got here!" |
AFAIK 这适用于除 MSVC 之外的大多数编译器,您必须在其上使用 pragma 指令:
1
| #pragma message ("C Preprocessor got here!" ) |
-
这引出了一个问题,你可以根据编译标志放置一个指令来以某种方式交换"pragma message"和"warning"吗?例如,类似:#ifdef _LINUX #define #preprocmsg"#warning" else #define #preprocmsg"#pragma message"... 我必须尝试一下,但直觉告诉我答案是否定的。
-
@布莱恩:是的。 #define WARNING(msg) _Pragma("message" #msg)
-
#pragma message() 不支持旧版本的 gcc(例如 gcc 4.1.2,RHEL5 上的默认版本)。我还没有为这些旧版本找到合适的等效项 - #warning 不会很好,因为警告通常对我们来说被视为错误,我们真的希望消息是信息性的,而不是停止编译.
-
当您的项目默认使用 -Wall 编译时,发出警告非常不方便。 #pragma message 没有这个问题。
-
有没有办法用宏值代替,这可能吗?也许像 #warning"DEBUG="DEBUG
MSVC 和 GCC 支持以下内容。
1 2
| #pragma message("stuff")
#pragma message"stuff" |
Clang 最近开始添加支持,请参阅此处了解更多信息。
-
仅作记录,Solaris Studio 12.3 (Sun C 5.12) 不支持此编译指示。
-
使用 Visual Studio vMicro 与 Arduino 1.8 一起工作。谢谢!
-
至少自 3.0 起由 clang 支持,自 5.1 起由 gcc 支持(并且自 4.4.7 起以稍微不同的形式)。即使 clang 说"生成了 1 个警告",使用 -Werror 构建时它也不会失败:gcc.godbolt.org/z/xoK6b8
你可能想试试:#pragma message("Hello World!")
大多数 C 编译器都会识别 #warning 指令,所以
还有标准的"#error"指令,
虽然所有编译器都支持这一点,但它也会停止编译/预处理。
效果很好。即使您使用 -Werror
也不会停止编译
-
有没有办法让这个工作与数字或其他值一起工作?它说它需要一个字符串,但我想打印出数字 #define 的计算结果。
另一种解决方案是使用注释和 shell 脚本来处理它们。这需要一些纪律(或捕获拼写错误的 shell 脚本)。
例如,我添加了格式为 //TODO 的注释,然后添加了一个 shell 脚本,它将所有这些注释收集到一个报告中。
对于更复杂的用例,您可以尝试编写自己的简单预处理器。例如,您可以将源代码编辑为 *.c2 文件。简单的预处理器会读取源代码,查找 //TODO,然后将 printf("TODO ...") 写入输出 *.c 文件。
你不能。预处理器在 C 代码之前处理。没有预处理器指令可以打印到屏幕上,因为预处理器代码没有被执行,它被用来生成将被编译成可执行代码的 C 代码。
有什么问题:
1 2 3
| #ifdef ...
printf("Hello");
#endif |
因为这就是预处理器所能做的一切。
- 这不会在编译时打印,这是我认为 OP 正在寻找的。
-
我以为他的意思是在运行时打印。
-
我在问编译时间。谢谢!