我正在构建一个大型C ++程序,它具有各种不同的编译时选项,由#define
s(或-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
// ...
;
重新定义令牌
#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或某些东西)作为编译时常量似乎很愚蠢。第三个例子,当然,只是直接上升不起作用,但它几乎是我想要做的。
有替代方法吗?
答案 0 :(得分:0)
#define AAAMSG ""
#define BBBMSG ""
#ifdef AAA
#define AAAMSG " [A]"
#endif
定义所有空位..然后将其视为一个开关。 如果您保持类型相同,则重新定义时不应该有任何问题。
注意:我不是100%确定这是有效的,但可以更改定义。
答案 1 :(得分:0)
关闭这个问题的评论我坚持选项1.似乎没有办法做我希望做的事情,所以不完美的遗骸。感谢那些贡献的人!