2016-03-30 25 views
0

我已經寫了一個宏--- swapMacro及其2個子宏,如下所示。宏在g ++中未能使用decltype(X)

#define swapMacro(X, Y) swap_Macro1(X, Y, decltype(X)) 
#define regTMP tmp ## __LINE__ ## __FILE__ 
#define swap_Macro1(X, Y, ARG_TYPE) \ 
do { \ 
    register ARG_TYPE regTMP; \ 
    swap_Macro2((X), (Y), regTMP); \ 
} while(0); 
#define swap_Macro2(X, Y, T) \ 
{ \ 
    (T)= (X);\ 
    (X)= (Y);\ 
    (Y)= (T);\ 
} 

這裏是測試它們的代碼。

int a= 110; 
int b= 220; 
{ 
    register int t; 
    swap_Macro2 (a, b, t); // works perfect, only 2 mem/r + 2 mem/w operations 
} 
swap_Macro1 (a, b, int); // works, as same as swap_Macro2 
swapMacro (a, b); // this one works if cflag -std=c++11 is set 

int *A= new int(10); 
int *B= new int(10); 
A[0]= 330; 
B[0]= 440; 
swapMacro ((A[0]), B[0]); // failed, even -std=c++11 is set 
swapMacro (A[0], B[0]); // failed, even -std=c++11 is set. However, the solution provide by Anton Savin solve it 

但如果我使用Visual C++ 2010再次做到這一點,所有3個宏工作,但他們都需要3 MEM/R和3 MEM/W操作(從調試的窗戶往外看)。 我不知道是否有任何適當的語法來編寫swapMacro(a,b)使用g ++?

+0

你使用的是什麼版本的GCC?什麼是命令行?你指定了'-std = C++ 11'還是'-std = C++ 14'? –

+1

爲什麼不使用內聯函數呢? – Jarod42

+0

歡迎來到Stack Overflow。發佈有關不起作用的問題時,發佈任何錯誤消息總是有幫助的。在這種情況下,g ++告訴你它爲什麼不編譯? –

回答

0

正如我在評論中寫的,您的代碼爲works for me。不過,我相信了錯誤的原因是您添加額外的括號的地方,像這樣:

swapMacro ((a), b); 

在這種情況下,decltype(X)變得decltype((a))這是不int,但現在int&

要解決它,你可以通過

#define swapMacro(X, Y) swap_Macro1(X, Y, std::remove_reference<decltype(X)>::type) 

這就是說改變swapMacro定義,我不太明白所有這些宏的目的,爲什麼你不只是用std::swap()

+0

謝謝你的回覆,std :: swap使用了3個mem/r和3個mem/w,我不知道是否可以使用2個mem/r和2個mem/w來交換基本類型的變量,我爲什麼要使用它: - )。稍後我會檢查我的代碼並嘗試使用你的代碼。 – jemin

相關問題