c++ - 构建多个字符串的最佳方法?

标签 c++ gcc c-preprocessor

我正在构建一个带有各种不同编译时选项的大型 C++ 程序,这些选项由 #define(或 -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. 重新定义 token

    #define REVISION __DATE__ " " __TIME__
    #ifdef AAA
    #define REVISION REVISION " [A]"
    #endif
    #ifdef BBB
    #define REVISION REVISION " [B]"
    #endif
    // ...
    

第一个非常冗长(想象一下有六个独立元素)并且容易出错。第二个要好得多,但它创建了一个常量而不是文字,所以我不能将它用作另一个字符串的一部分 - 示例:

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

对编译时常量使用运行时字符串操作(sprintf 或类似的东西)似乎很愚蠢。第三个例子,当然,直接上去是行不通的,但这正是我想要做的。

有什么替代方法吗?

最佳答案

#define AAAMSG ""
#define BBBMSG ""

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

定义你所有的容器……然后把它当作一个开关。 如果您保持类型相同,那么重新定义就不会有任何问题。

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

关于c++ - 构建多个字符串的最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9474656/

相关文章:

c++ - 创建一个 C++ 宏,可以轻松创建虚函数包装函数

c++ - 在 C++ 函数中就地处理参数

java - jni 回调中的黑色 Sprite

C++0x Lambda 到 VS 2010 中的函数指针

c - 如何在 asm 内联语句中请求通用寄存器?

c - 升级到Mavericks,C编译器无法创建可执行文件

c - 在宏定义中使用方括号

c++ - Qt weatherinfo demo中,部分内容超出窗口边界

c - 给定堆栈和寄存器的状态,我们能否预测 printf 未定义行为的结果

c++ - 是否可以使用#define 更改#include 文件名?