2011-10-13 152 views
2

我想根據作爲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傳遞的值的字符串。

任何幫助! 謝謝!

回答

8

定義宏這樣,使用 「stringize運營商」:

#define ABC(x,y) "anystr_" #x "_" #y ".tar.bz2" 
+0

我雖然是令牌concat ##。或者#x不是concat,而是其他的東西? –

+0

@DavidHeffernan'#'是字符串。在我的編譯器上,連接是自動完成的(不需要'##')。我認爲這是標準? – cnicutar

+2

謝謝。我剛剛學到了一些東西。我確定它是標準的,我在無知的問題上問了我這個問題! –

0

在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") 
} 
+2

這將導致除非'x'錯誤和'y'被指定爲' 「2」'和' 「3」 '。 –

+0

是的,這可能是從宏觀上可以得到的最多。在串聯中,在預處理器中幾乎沒有什麼可以做的。但是,你的連接錯誤,你需要使用字符串,而不是連接自動完成字符串:(「anystr_」#x「_」#y「.tar.bz2」) – Suma

+0

'##'是令牌粘貼操作符。 ..沒有字符串化。它應該使用參數上的單個'#'。 –

1

宏不回東西,因爲它們不是功能。它們只是令牌替換功能。你真正想要的是一個雖然一個,而在你的地方,我會用一個函數來做。然而,一個解決辦法是這樣的:

#define ABC(x,y) "anystr_" #x "_" #y ".tar.bz2" 

這需要從槓桿的事實,字符串文字togheter倒塌,所以"Hello " "World!"被解釋爲"Hello World!"

+0

這個標籤不是'C'嗎? – cnicutar

+0

@cnicutar:Boost預處理器庫基於C和C++之間共享的預處理器。 –

+0

但是,正確的標準字符串大小的時候,爲什麼要使用boost字符串呢? 「anystr_」#x「_」#y「.tar.bz2」 – Suma

相關問題