我想根據作爲MACRO FUNCTION參數傳遞的值創建一個字符串。 類似:如何從C中的MACRO函數返回一個字符串?
#define ABC(x,y) return "anystr_x_y.tar.bz2"
main()
{
a = ABC(2,3);
}
所以最後,它應該返回「anystr_2_3.tar.bz2」
我想知道如何創建作爲參數宏FNC傳遞的值的字符串。
任何幫助! 謝謝!
我想根據作爲MACRO FUNCTION參數傳遞的值創建一個字符串。 類似:如何從C中的MACRO函數返回一個字符串?
#define ABC(x,y) return "anystr_x_y.tar.bz2"
main()
{
a = ABC(2,3);
}
所以最後,它應該返回「anystr_2_3.tar.bz2」
我想知道如何創建作爲參數宏FNC傳遞的值的字符串。
任何幫助! 謝謝!
定義宏這樣,使用 「stringize運營商」:
#define ABC(x,y) "anystr_" #x "_" #y ".tar.bz2"
在C(也就是C++)中沒有這樣的宏功能。編譯代碼之前,宏由預處理器處理。你的示例代碼上面會由編譯器進行處理,以這樣的:
main()
{
a = return "anystr_x_y.tar.bz2"
}
要達到什麼樣的你正在嘗試做的,你需要告訴預處理器concattenate x,y和你的字符串常量部分。你這樣做,使用##運營商,如:
#define ABC(x,y) ("anystr_" ## x ## "_" ## y ## ".tar.bz2")
這將導致下面的代碼被傳遞到編譯:
main()
{
a = ("anystr_2_3.tar.bz2")
}
這將導致除非'x'錯誤和'y'被指定爲' 「2」'和' 「3」 '。 –
是的,這可能是從宏觀上可以得到的最多。在串聯中,在預處理器中幾乎沒有什麼可以做的。但是,你的連接錯誤,你需要使用字符串,而不是連接自動完成字符串:(「anystr_」#x「_」#y「.tar.bz2」) – Suma
'##'是令牌粘貼操作符。 ..沒有字符串化。它應該使用參數上的單個'#'。 –
宏不回東西,因爲它們不是功能。它們只是令牌替換功能。你真正想要的是一個雖然一個,而在你的地方,我會用一個函數來做。然而,一個解決辦法是這樣的:
#define ABC(x,y) "anystr_" #x "_" #y ".tar.bz2"
這需要從槓桿的事實,字符串文字togheter倒塌,所以"Hello " "World!"
被解釋爲"Hello World!"
。
我雖然是令牌concat ##。或者#x不是concat,而是其他的東西? –
@DavidHeffernan'#'是字符串。在我的編譯器上,連接是自動完成的(不需要'##')。我認爲這是標準? – cnicutar
謝謝。我剛剛學到了一些東西。我確定它是標準的,我在無知的問題上問了我這個問題! –