宏SWAP(t,x,y)交换类型为t的两个参数

时间:2013-05-04 18:16:48

标签: c pointers swap c-preprocessor

所以我基本上试图创建一个交换两个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;
}

任何可能出错的想法?​​

3 个答案:

答案 0 :(得分:5)

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

v[i++]是一个int元素,但您将其分配给指针对象:

T *p = x;

因此,您何时在p中取消引用T z = *p;,您会遇到段错误。如果需要指向元素的指针,请使用&运算符。

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

答案 1 :(得分:3)

#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)]);

答案 2 :(得分:0)

此解决方案通过仅重新设置参数一次并通过重用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)