我正在构建一个带有各种不同编译时选项的大型 C++ 程序,这些选项由 #define
(或 -D
选项)选择。
我想要一个版本字符串,将其中的一些列为标签,理想情况下,将该版本字符串定义为文字,而不是常量。
目前,我正在考虑三个选项,但没有一个是理想的。
一堆预处理器定义
#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
建立常量
const char *const REVISION=__DATE__ " " __TIME__ #ifdef AAA " [A]" #endif #ifdef BBB " [B]" #endif // ... ;
重新定义 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/