【问题标题】:Preprocessor Quoting macro arguments预处理器引用宏参数
【发布时间】:2011-04-01 22:49:17
【问题描述】:

假设我有一些宏#define NAME name,并且我想定义一些其他宏,它将扩展为引用的值。也就是说,好像我也定义了#define NAME_STR "name"。还有比以下更简洁的方法吗?

#define QUOT(str)   #str
#define QUOT_ARG(str)   QUOT(str)
#define NAME_STR    QUOT_ARG(NAME)

【问题讨论】:

    标签: macros c-preprocessor stringification


    【解决方案1】:

    并非如此,因为在字符串化中使用宏参数时不会扩展。来自GNU C PreProcessor manual:

    与普通的参数替换不同, 参数不是宏扩展的 第一的。这称为字符串化。

    来自同一来源:

    如果你想将结果字符串化 宏参数的扩展,你 必须使用两级宏。

    ...继续举例:

     #define xstr(s) str(s)
     #define str(s) #s
     #define foo 4
     str (foo)
          ==> "foo"
     xstr (foo)
          ==> xstr (4)
          ==> str (4)
          ==> "4"
    

    【讨论】:

    • 该示例具有误导性:foo 在替换列表中使用之前不会被宏替换为4,因此应该是xstr (foo) 变为str (4) 变为"4"。我认为,说你有xstr (4) 是一种误导。
    • @James McNellis:同意,该示例暗示了类似于自引用宏的某些内容,之后不会对其进行扩展。我想知道是否应该编辑该示例或将其与这些 cmets 一起保留...
    猜你喜欢
    • 1970-01-01
    • 2012-05-27
    • 2011-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-15
    相关资源
    最近更新 更多