マクロ--- 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 MEM/rと3 MEM/wの操作を必要とするものの、すべての3つのマクロは、動作します。 g ++の使用のためにswapMacro(a、b)を書くための適切な構文があるのだろうか?
どのGCCのバージョンを使用していますか?コマンドラインとは何ですか? '-std = C++ 11'または' -std = C++ 14'を指定しましたか? –
代わりにインライン関数を使用してみませんか? – Jarod42
ようこそスタックオーバーフロー。動作しないものについて質問を投稿するときは、エラーメッセージを投稿すると常に役立ちます。この場合、g ++がなぜコンパイルされないのかをあなたに伝えるのは何ですか? –