2016-03-30 7 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 MEM/rと3 MEM/wの操作を必要とするものの、すべての3つのマクロは、動作します。 g ++の使用のためにswapMacro(a、b)を書くための適切な構文があるのだろうか?

+0

どのGCCのバージョンを使用していますか?コマンドラインとは何ですか? '-std = C++ 11'または' -std = C++ 14'を指定しましたか? –

+1

代わりにインライン関数を使用してみませんか? – Jarod42

+0

ようこそスタックオーバーフロー。動作しないものについて質問を投稿するときは、エラーメッセージを投稿すると常に役立ちます。この場合、g ++がなぜコンパイルされないのかをあなたに伝えるのは何ですか? –

答えて

0

コメントに書いたように、コードworks for me。しかし、私はエラーの理由は、あなたがどこかに余分な括弧を追加したことであると信じて、このように:この場合

swapMacro ((a), b); 

decltype(X)decltype((a))になり、それが今intしかしint&ではありません。あなたは、私は非常にすべてのこれらのマクロの目的を理解していないと、なぜあなただ​​けstd::swap()を使用していない、と述べた

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

によってswapMacro定義を変更することができ、それを修正するには

+0

返信いただきありがとうございます、std :: swapは3 mem/rと3 mem/wを使用します。私は2 mem/rと2 mem/wを使用して基本型の変数を交換することができますか? - )。私は後で自分のコードをチェックし、あなたのものを試してみます。 – jemin

関連する問題