C++ 宏未能在g+;中使用decltype(X)+;

C++ 宏未能在g+;中使用decltype(X)+;,c++,macros,C++,Macros,我编写了一个宏——swapMacro及其两个子宏,如下所示 #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); \ } whil

我编写了一个宏——swapMacro及其两个子宏,如下所示

#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操作(从调试器窗口看)。
我想知道是否有合适的语法来编写使用g++的swapMacro(a,b)?

正如我在注释中所写,您的代码。但是,我认为错误的原因是您在某处添加了额外的括号,如下所示:

swapMacro ((a), b);
在这种情况下,
decltype(X)
变为
decltype((a))
,现在不是
int
,而是
int&

要修复它,您可以通过以下方式更改
swapMacro
定义

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

也就是说,我不太明白所有这些宏的用途,以及为什么不直接使用
std::swap()

您使用的是什么版本的GCC?命令行是什么?是否指定了
-std=c++11
-std=c++14
?为什么不改用内联函数?欢迎使用堆栈溢出。当发布关于不起作用的问题时,发布任何错误消息总是有帮助的。在这种情况下,g++告诉您它为什么不编译的原因是什么?使用
std::swap
。对于现代编译器,这可能导致零操作。编译器只知道您之前称为
a
的内容之后称为
b
,反之亦然。这是编译时簿记。@AntonSavin,我使用gcc 4.8.4,并启用标志-std=c++11。感谢您的回复,std::swap使用3个mem/r和3个mem/w,我想知道使用2个mem/r和2个mem/w交换基本类型的变量是否可以实现,为什么我应该使用它:-)。我稍后会检查我的代码,然后试试你的。