代码之家  ›  专栏  ›  技术社区  ›  SakoDaemon

在另一个宏中使用字符串宏[复制]

  •  1
  • SakoDaemon  · 技术社区  · 7 年前

    我有这个:

    #define MAX_OPERATION_COUNT 10
    #define MSG_TOO_MANY_OPERATIONS "Too many operations! Only the first 10 were applied."
    

    但是我希望第二个宏使用第一个宏的值。例如,在Java中,我会有如下内容:

    public static final int MAX_OPERATION_COUNT = 10;
    public static final String MSG_TOO_MANY_OPERATIONS = "Too many operations! Only the first " + MAX_OPERATION_COUNT + " were applied.";
    

    在C语言中有没有类似的方法?

    解决这个问题的方法和解决这个问题的方法非常相似 this question ,但我认为问题本身是完全不同的,应该分开处理。

    4 回复  |  直到 7 年前
        1
  •  8
  •   Matt    7 年前

    通常情况下,处理printf样式的格式比较容易 "Too many operations! Only the first %u were applied"

    #define STR(x) STR2(x)
    #define STR2(x) #x
    #define MAX_OPERATION_COUNT 10
    #define MSG_TOO_MANY_OPERATIONS "Too many operations! Only the first " STR(MAX_OPERATION_COUNT) " were applied."
    
        2
  •  1
  •   alk    7 年前

    #define STRINGYFY(x) # x
    #define PASTE_AS_STRING(s) STRINGYFY(s)
    
    #define MAX_OPERATION_COUNT 10
    #define MANY_OPERATION_COUNT 2
    
    #define MSG_TOO_MANY_OPERATIONS_TEMPLATE(n) \
      "Too many operations! Only the first" PASTE_AS_STRING(n) " were applied."
    
    #define MSG_TOO_MANY_OPERATIONS \
      MSG_TOO_MANY_OPERATIONS_TEMPLATE(MAX_OPERATION_COUNT)
    #define MSG_MUCH_TOO_MANY_OPERATIONS \
      MSG_TOO_MANY_OPERATIONS_TEMPLATE(MANY_OPERATION_COUNT)
    

    (刚才看到了 Matt's answer


    要定义数组

    const char MSG_TOO_MANY_OPERATIONS[] = 
      MSG_TOO_MANY_OPERATIONS_TEMPLATE(MAX_OPERATION_COUNT)
    const char MSG_MUCH_TOO_MANY_OPERATIONS[] =
      MSG_TOO_MANY_OPERATIONS_TEMPLATE(MANY_OPERATION_COUNT)
    

    或者定义指针呢

    const char * MSG_TOO_MANY_OPERATIONS = 
      MSG_TOO_MANY_OPERATIONS_TEMPLATE(MAX_OPERATION_COUNT)
    const char * MSG_MUCH_TOO_MANY_OPERATIONS =
      MSG_TOO_MANY_OPERATIONS_TEMPLATE(MANY_OPERATION_COUNT)
    
        3
  •  0
  •   gsamaras a Data Head    7 年前

    #define MAX_OPERATION_COUNT "10"
    #define MSG_TOO_MANY_OPERATIONS "Too many operations! Only the first " MAX_OPERATION_COUNT " were applied."
    
        4
  •  0
  •   nullp0tr    7 年前

    你可以做:

    #define FOO "1"
    #define BAR "How many foos? " FOO " foo.\n"
    

    BAR 现在扩展到

    "How many foos? " "1" " foo.\n"