2015-03-13 74 views
0
#define SWAP(x, y, T) do { T temp##x##y = x; x = y; y = temp##x##y; } while (0) 

我看到這個交換宏C.在下面的語句中,##運算符有什麼用處?

有人能解釋一下它的工作原理和使用temp##x##y

+0

[令牌串聯](https://gcc.gnu.org/onlinedocs/cpp/Concatenation.html)... – 2015-03-13 18:39:14

回答

1

它連接tempxy來幫助聲明T類型的變量,這將允許交換工作。

您可以使用它像這樣

int a = 1; 
int b = 2; 

SWAP(a, b, int); 

生成的代碼將

int a = 1; 
int b = 2; 

do { 
    int tempab = a; 
    a = b; 
    b = tempab; 
} while (0); 

它避免了使用相同的名稱所傳遞的變量,你可以看到,因爲假設你定義的宏像這樣

#define SWAP(x, y, T) do { T z = x; x = y; y = z; } while (0) 

那麼這個

int x = 1; 
int z = 2; 

SWAP(z, x, int); 

將不起作用。

+0

我可能只是說*這是多麼愚蠢嗎?它打破了一個簡單的'SWAP(a [0],a [1],int)'。這就像作家不知道範圍是什麼。事實上,這個類型甚至不需要,這就是'decltype()'和'auto'的全部。 – Blindy 2015-03-13 18:45:20

+0

在他更改答案以捍衛原始代碼之前寫的評論。只是爲了後人。 – Blindy 2015-03-13 18:47:37

+0

@Bindind我同意你的意見。只是這是答案,我不是捍衛原始代碼,只是我認爲這是宏觀作者正在考慮的內容。 – 2015-03-13 18:49:02

相關問題