在多个部分中构建字符串的最佳方法?

时间:2012-02-28 00:35:57

标签: c++ gcc c-preprocessor

我正在构建一个大型C ++程序,它具有各种不同的编译时选项,由#define s(或-D选项)选择。

我希望有一个版本字符串,将其中的一些列为标签,理想情况下,将该版本字符串定义为文字,而不是常量。

目前,我正在考虑三个选项,其中没有一个是理想选择。

  1. 成堆的预处理器定义

    #ifdef AAA
    #define AAAMSG " [A]"
    #else
    #define AAAMSG ""
    #endif
    #ifdef BBB
    #define BBBMSG " [B]"
    #else
    #define BBBMSG ""
    #endif
    // ...
    #define REVISION __DATE__ " " __TIME__ AAAMSG BBBMSG CCCMSG DDDMSG
    
  2. 构建常量

    const char *const REVISION=__DATE__ " " __TIME__
    #ifdef AAA
    " [A]"
    #endif
    #ifdef BBB
    " [B]"
    #endif
    // ...
    ;
    
  3. 重新定义令牌

    #define REVISION __DATE__ " " __TIME__
    #ifdef AAA
    #define REVISION REVISION " [A]"
    #endif
    #ifdef BBB
    #define REVISION REVISION " [B]"
    #endif
    // ...
    
  4. 第一个是令人难以置信的冗长(想象有六个独立元素)并且容易出错。第二个更好,但它创建一个常量而不是文字,所以我不能将它用作另一个字符串的一部分 - 例如:

    send(sock,"rev " REVISION "\n",sizeof(REVISION)+4,0);
    

    使用运行时字符串操作(sprintf或某些东西)作为编译时常量似乎很愚蠢。第三个例子,当然,只是直接上升不起作用,但它几乎是我想要做的。

    有替代方法吗?

2 个答案:

答案 0 :(得分:0)

#define AAAMSG ""
#define BBBMSG ""

#ifdef AAA
    #define AAAMSG " [A]"
#endif

定义所有空位..然后将其视为一个开关。 如果您保持类型相同,则重新定义时不应该有任何问题。

注意:我不是100%确定这是有效的,但可以更改定义。

答案 1 :(得分:0)

关闭这个问题的评论我坚持选项1.似乎没有办法做我希望做的事情,所以不完美的遗骸。感谢那些贡献的人!