我已經寫了一個宏--- 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 ++?
你使用的是什麼版本的GCC?什麼是命令行?你指定了'-std = C++ 11'還是'-std = C++ 14'? –
爲什麼不使用內聯函數呢? – Jarod42
歡迎來到Stack Overflow。發佈有關不起作用的問題時,發佈任何錯誤消息總是有幫助的。在這種情況下,g ++告訴你它爲什麼不編譯? –