2011-08-26 18 views
1

DD應該做什麼?如果在C中編譯時間可變大小的字符串文字

#define HEADING_TITLE_PROJECT_NAME "<= Version Maintenance Based On Compiled DateTime =>" 
#define SIZE_OF_HEADER_FOR_DECORATION_PURPOSE sizeof(HEADING_TITLE_PROJECT_NAME) 
#define DD ???? 
#define HEADING "\r\n"DD"\r\n"HEADING_TITLE_PROJECT_NAME"\r\n"DD"\r\n" 

我想HEADING字符串文字如下

<==================================================> 
<= Version Maintenance Based On Compiled DateTime => 
<==================================================> 

等號(=)或任何東西,我把一度將內<重複== == ... >填寫HEADING_TITLE_PROJECT_NAME空間。

可以這樣做或其他。 我只想在編碼時間內更改HEADING_TITLE_PROJECT_NAME,而沒有別的。 想如果這是可以做到 :)

< ==編輯開始==> 喜歡的東西

#define DD\ 
char * get()\ 
{\ 
    char arr[100] = '\0';\ 
    for (int i=0; i < SIZE_OF_HEADER_FOR_DECORATION_PURPOSE - 1; i++)\ 
    {\ 
     arr[i] = "=";\ 
    }\ 
    return arr;\ 
} 

< ==編輯結束==>

回答

0

這是不可能的,因爲sizeof是在預處理器之後而不是之前評估的。

如果您事先知道字符串的長度,那就是。

由於協處理器沒有任何循環結構,因此您最終創建它們。升壓的確是這樣的

#define REPEAT_TIMES(macro, n) REPEAT##n(macro) 
#define REPEAT1(macro) MACRO 
#define REPEAT2(macro) REPEAT1(macro)MACRO 
#define REPEAT3(macro) REPEAT2(macro)MACRO 
.... 

你可以這樣簡單地說:

#define FILLER "=" 
#define DD "<"REPEAT_TIMES(FILLER, 34)">" 
3

不幸的是,沒有自動方式在標準C預處理器中生成DD,只要你想在你的宏定義中使用HEADING即可。

只要你堅持讓HEADING定義他們目前定義的方式,我只能建議使用半自動方法:)。明確地手動定義DD

#define HEADING_TITLE_PROJECT_NAME "<= Version Maintenance Based On Compiled DateTime =>" 
#define DD       "<==================================================>" 

然後只需添加

STATIC_ASSERT(sizeof HEADING_TITLE_PROJECT_NAME == sizeof DD); 

有權根據它(您最喜愛的執行STATIC_ASSERT)。這樣,DD長度上的任何差異將立即觸發錯誤並迫使開發者更新DD

+0

最後,這是唯一的選擇,我已經.. \ M / – Rick2047

-1

您的DD的實施並不是一個壞主意,雖然它遭受了一些糟糕的語法和未定義的行爲。

const char *DDD(void) 
{ 
    static char arr[] = HEADING_TITLE_PROJECT_NAME; 
    if(arr[2] == ' ') 
     for(size_t i = 2; i + 3 < sizeof arr; i++) 
      arr[i] = '='; 
    return arr; 
} 
#define DD DDD() 

您不能返回指向堆棧數據的指針,因此您必須使用static數組。我們可以通過將它自動設置爲#define d字符串,然後檢查它是否已填充'=',並且如果不填充,確保它的大小合適。然後我們返回一個const指針,以便沒有人試圖修改它。

您的宏定義了一個函數get,它帶有未指定的參數,並返回一個可修改的char *堆棧數據。不幸的是,這個函數將在你使用宏的任何地方定義,這將導致許多定義錯誤。

你不能在原始字符串連接中使用它,但它將適用於你想要的其他任何東西。

相關問題