2012-02-28 49 views
3

我建立與各種不同的編譯時選擇的大型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 
    // ... 
    

第一個是令人難以置信的冗長(設想有六個獨立元素)並且容易出錯。第二個是更好的,但它會創建一個常數代替文字,所以我不能用它作爲另一個字符串的一部分 - 例如:

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

看來愚蠢使用運行時字符串操作(一個sprintf或somesuch)編譯時常量。第三個例子,當然,只是直線運行不起作用,但它幾乎是我想要做的。

是否有一些替代方法?

+0

它不是'sizeof(REVISION)+ 5'嗎? – 2012-02-28 02:22:36

+0

您可能有興趣在[constexp](http://groups.google.com/group/comp.lang.c++.moderated/browse_thread/thread/d9bddd4105f1441e?hl=en&pli=1)編譯時間字符串處理 – 2012-02-28 02:30:05

+0

@JoeMcGrath - 不,因爲sizeof包含最後的\ 0,我不會傳送。 – rosuav 2012-02-28 06:17:25

回答

0

封山(沙)與我和選項1.堅持評論這個問題似乎有沒有辦法做我希望做的,所以不完美的遺體。感謝那些貢獻!

0
#define AAAMSG "" 
#define BBBMSG "" 

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

定義你所有的容器..然後把它當作開關。 如果你保持相同的類型,你不應該有任何問題重新定義..

注意:我不是100%肯定這個工程,但改變一個定義可以完成。

+0

改變一個定義需要首先解決它(gcc特別允許你重新定義一些已經存在的東西,但這是一個實質性的改變),所以這不會太笨重。我確實考慮過這種可能性,但它與我的原始選項1沒有本質區別,它將一個選項的代碼片斷分開。 – rosuav 2012-02-28 06:14:51

相關問題