【问题标题】:How do I show the value of a #define at compile time in gcc如何在 gcc 的编译时显示 #define 的值
【发布时间】:2012-03-30 10:57:53
【问题描述】:

到目前为止,我已经做到了:

#define ADEFINE "23"
#pragma message ("ADEFINE" ADEFINE)

哪个有效,但如果 ADEFINE 不是字符串怎么办?

#define ADEFINE 23
#pragma message ("ADEFINE" ADEFINE)

原因:

警告:“#pragma message”格式错误,已被忽略

理想情况下,我希望能够处理任何值,包括 undefined。

【问题讨论】:

    标签: c gcc macros c-preprocessor pragma


    【解决方案1】:

    我不确定这是否会满足您的要求,但如果您只对此感兴趣以调试偶尔出现的宏问题(因此您不需要在每次编译的消息中显示它),以下可能为你工作。使用 gcc 的 -E -dD 选项转储 #define 指令以及预处理输出。然后通过grep 管道,只查看你想要的行:

    // test.c
    #include <stdlib.h>
    #include <stdio.h>
    #define ADEFINE "23"
    #include <string.h>
    
    int main(int argc, char *argv[])
    {
    #undef ADEFINE
    #define ADEFINE 42
        return 0;
    }
    

    命令gcc -E -dD -c test.c | grep ADEFINE 显示:

    #define ADEFINE "23"
    #undef ADEFINE
    #define ADEFINE 42
    

    【讨论】:

      【解决方案2】:

      要显示不是字符串的宏,stringify the macro:

      #define STRINGIFY(s) XSTRINGIFY(s)
      #define XSTRINGIFY(s) #s
      
      #define ADEFINE 23
      #pragma message ("ADEFINE=" STRINGIFY(ADEFINE))
      

      如果你有/想要boost,你可以使用boost stringize为你做:

      #include <boost/preprocessor/stringize.hpp>
      #define ADEFINE 23
      #pragma message ("ADEFINE=" BOOST_PP_STRINGIZE(ADEFINE))
      

      【讨论】:

      • 好吧,我认为我的客户不会很高兴将其添加为依赖项,但这看起来像是存在证明。也许我应该去看看 stringize.hpp
      • @JohnLawrenceAspden 我更新了答案,说明如何在没有提升(或任何其他库)的情况下做到这一点。
      • 您的链接不再有效:“字符串化宏”
      猜你喜欢
      • 2010-12-06
      • 2015-09-04
      • 1970-01-01
      • 2011-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多