我建立與各種不同的編譯時選擇的大型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或somesuch)編譯時常量。第三個例子,當然,只是直線運行不起作用,但它幾乎是我想要做的。
是否有一些替代方法?
它不是'sizeof(REVISION)+ 5'嗎? – 2012-02-28 02:22:36
您可能有興趣在[constexp](http://groups.google.com/group/comp.lang.c++.moderated/browse_thread/thread/d9bddd4105f1441e?hl=en&pli=1)編譯時間字符串處理 – 2012-02-28 02:30:05
@JoeMcGrath - 不,因爲sizeof包含最後的\ 0,我不會傳送。 – rosuav 2012-02-28 06:17:25