【问题标题】:Is there a portable way to print a message from the C preprocessor?是否有可移植的方式从 C 预处理器打印消息?
【发布时间】:2011-04-19 02:47:31
【问题描述】:

我希望能够做类似的事情

#print "C Preprocessor got here!"

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

【问题讨论】:

    标签: printing c-preprocessor


    【解决方案1】:

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

    #warning "C Preprocessor got here!"
    

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

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

    【讨论】:

    • 这引出了一个问题,你可以根据编译标志放置一个指令来以某种方式交换“pragma message”和“warning”吗?例如,类似:#ifdef _LINUX #define #preprocmsg "#warning" else #define #preprocmsg "#pragma message"... 我必须尝试一下,但直觉告诉我答案是否定的。
    • @Bryan:是的。 #define WARNING(msg) _Pragma("message " #msg)
    • #pragma message () 不支持旧版本的 gcc(例如 gcc 4.1.2,RHEL5 上的默认版本)。我还没有为这些旧版本找到合适的等价物 - #warning 不会很好,因为警告通常对我们来说被视为错误,我们真的希望消息是信息性的,而不是停止编译。
    • 当你的项目默认使用 -Wall 编译时,发出警告非常不方便。 #pragma message 没有这个问题。
    • 有没有办法用宏值代替,这可能吗?也许像#warning "DEBUG="DEBUG
    【解决方案2】:

    MSVCGCC 支持以下内容。

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

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

    【讨论】:

    • 仅作记录,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
    【解决方案3】:

    您不妨试试:#pragma message("Hello World!")

    【讨论】:

      【解决方案4】:

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

       #warning "Got here"
      

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

       #error "Got here"
      

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

      【讨论】:

        【解决方案5】:
        #pragma message("foo")
        

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

        【讨论】:

        • 有没有办法让它与数字或其他值一起工作?它说它需要一个字符串,但我想打印出数字 #define 的计算结果。
        【解决方案6】:

        另一个解决方案是使用 cmets 和一个 shell 脚本来处理它们。这需要一定的纪律(或捕捉拼写错误的 shell 脚本)。

        例如,我添加了格式为//TODO 的 cmets,然后添加了一个将所有它们收集到报告中的 shell 脚本。

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

        【讨论】:

          【解决方案7】:

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

          有什么问题:

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

          因为就预处理器而言,这就是您所能做的一切。

          【讨论】:

          • 这不会在编译时打印,这是我认为 OP 正在寻找的。​​span>
          • 我以为他的意思是在运行时打印。
          • 我在询问编译时间。谢谢!
          猜你喜欢
          • 2023-04-04
          • 2010-11-15
          • 1970-01-01
          • 2010-09-15
          • 2011-02-09
          • 2010-11-18
          • 2014-04-06
          • 1970-01-01
          • 2018-06-23
          相关资源
          最近更新 更多