2017-07-24 22 views
0

我已經閱讀了很多有關宏化的字符串,但我顯然不太明白。我想創建一個字符串,其中需要首先評估宏的參數。有人可以解釋我的錯在哪裏,或者如何更好地做到這一點?C方程的結果的字符串化的結果

#define SDDISK   2  // Note defined in a library file elsewhere ie not a constant I know) 

#define DRIVE_STR(d) #d ":/" 
#define xDRIVE_STR(x) DRIVE_STR(x) 
#define FILEPATH(f)  xDRIVE_STR(SDDISK + '0') #f 

const char file[] = FILEPATH(test.log); 

void main(void) 
{ 
    DebugPrint(file); 
} 

輸出是: 「2 + 0」:/ test.log中「,
但我想 」2:/test.log「

+2

[只需放下'+'0'](http://ideone.com/n9UBZP)。 – Cornstalks

+0

爲什麼如果你不想要的話就把'0'放進去? –

+0

宏由預處理器擴展。預處理器也可以進行字符串化。之後,當編譯器看到代碼時,'2'將已經在雙引號內。因此,不需要將「0」添加到「2」以將其轉換爲字符「2」。 –

回答

0

C預處理器運行編譯程序不斷看到前代碼。

這意味着方程在被串化之前不會被評估;相反,預處理器會將整個方程串化。

在你的情況下,只是刪除+'0'將解決問題,因爲SDDISK的值在字符串化之前不需要轉換爲char。

但是,如果你的實際需要之前字符串化來進行計算,你應該:

  1. 使用cpp的constexpr
  2. 向編譯器供應商抱怨常量表達式未優化。
  3. 使用預處理器庫來獲得所需的行爲。