Printing 是否有一种可移植的方式来打印来自C预处理器的消息?

Printing 是否有一种可移植的方式来打印来自C预处理器的消息?,printing,c-preprocessor,Printing,C Preprocessor,我希望能够做一些像 #print "C Preprocessor got here!" 用于调试目的。做这件事最好/最方便的方法是什么?你不能。预处理器在C代码之前进行处理。没有要打印到屏幕上的预处理器指令,因为预处理器代码没有被执行,它被用来生成C代码,C代码将被编译成可执行代码 有什么问题吗 #ifdef ... printf("Hello"); #endif 因为这是预处理器所能做的一切。警告指令可能是最接近的指令,但它不是完全独立于平台的: #warning "C Preproces

我希望能够做一些像

#print "C Preprocessor got here!"

用于调试目的。做这件事最好/最方便的方法是什么?

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

有什么问题吗

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

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

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

#warning "C Preprocessor got here!"
AFAIK这适用于除MSVC之外的大多数编译器,在MSVC上必须使用
pragma
指令:

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

您可能希望尝试:
#pragma message(“Hello World!”)

和支持以下内容


Clang最近开始添加支持,请参阅以了解更多信息。

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

 #warning "Got here"
还有标准的“错误”指令

 #error "Got here"
虽然所有编译器都支持这一点,但它也会停止编译/预处理

#pragma message("foo")

效果很好。即使使用-Werror也不会停止编译另一种解决方案是使用注释和shell脚本来处理它们。这需要一些规则(或捕获打字错误的shell脚本)

例如,我添加格式化为
//TODO
的注释,然后添加一个shell脚本,将所有注释收集到一个报告中


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

这不会在编译时打印,这正是我认为OP要寻找的。我假设他是指在运行时打印。我问的是编译时。谢谢这就引出了一个问题,您是否可以基于编译标志设置一个指令,以某种方式交换“pragma message”和“warning”?例如,类似于:
#ifdef#LINUX#define#prepocmg“#warning”else#define#prepocmg“#pragma message”
。。。我得试试,但直觉告诉我答案是否定的。@布赖恩:是的<代码>#定义警告(msg)_Pragma(“消息”#msg)#旧版本的gcc不支持Pragma消息()(如gcc 4.1.2,RHEL5上的默认版本)。我还没有为这些旧版本找到合适的等价物-#警告不会很好,因为警告通常被视为错误,我们希望消息是信息性的,而不是停止编译。当您的项目默认使用-Wall编译时,发出警告非常不方便#pragma消息没有这个问题。请注意,Solaris Studio 12.3(Sun C 5.12)不支持此pragma。使用Visual Studio vMicro与Arduino 1.8配合使用。谢谢至少从3.0开始由clang支持,从5.1开始由gcc支持(从4.4.7开始以稍微不同的形式)。即使clang说“生成了1个警告”,但在使用
-Werror
构建时,它也不会失败:有没有办法让数字或其他值起作用?它说它需要一个字符串,但我想打印出一个数值
#define
的计算结果。
#pragma message("foo")