-->

宏SWAP(T,X,Y)交换类型t两个参数(Macro SWAP(t,x,y) exchanging

2019-09-28 04:53发布

所以我基本上是试图让该交换类型t两个参数的SWAP(T,X,Y)宏。 我想,当这两种说法的形式是想解决问题去

v [I ++]和W [F(X)],即SWAP(INT,V [I ++],W [F(X)])。

下面的代码基本上是崩溃......

#define SWAP(T,x,y) {T *p = x; T *q = y; T z = *p; *p = *q; *q = z;}

int f (int x){
    return (0-x);
}

int main(void) {

int v[] = {1,2,3};
int i = 0;

int w[] = {4,5,6};
int x = -1;

int *p = v;
int *q = w;

SWAP(int*, v[i++],w[f(x)]);

return 0;
}

任何想法可能会错呢?

Answer 1:

SWAP(int*, v[i++],w[f(x)]);

v[i++]是一个int元件但你将其分配给指针对象中:

T *p = x;

所以当你解引用pT z = *p; 你得到一个段错误。 如果你想有一个指针元件使用&操作。

此外v[i++]有副作用(它修改i++ ),你不应该传递有一个宏调用的副作用表达式。



Answer 2:

#define SWAP(T,x,y) {T *p = &(x); T *q = &(y); T z = *p; *p = *q; *q = z;}
...
    SWAP(int, v[i++], w[f(x)]);


Answer 3:

该解决方案仅通过一次instansiating参数和通过重用遮蔽避免副作用SWAP作为标识符。

#define SWAP(type, a_, b_) \
do { \
    struct { type *a; type *b; type t; } SWAP; \
    SWAP.a  = &(a_); \
    SWAP.b  = &(b_); \
    SWAP.t  = *SWAP.a; \
    *SWAP.a = *SWAP.b; \
    *SWAP.b = SWAP.t; \
} while (0)


文章来源: Macro SWAP(t,x,y) exchanging two arguments of type t