宏和函数中sizeof的区别

时间:2015-02-07 18:20:08

标签: c macros

我在stackoverflow上的answer中找到了通用交换函数的以下声明。

#define swap(x,y) do \ 
{ unsigned char swap_temp[sizeof(x) == sizeof(y) ? (signed)sizeof(x) : -1]; \
  memcpy(swap_temp,&y,sizeof(x)); \
  memcpy(&y,&x,       sizeof(x)); \
  memcpy(&x,swap_temp,sizeof(x)); \
} while(0)

但是如果我们在C中编写类似的函数它不起作用,我们需要明确地传递void *类型的大小才能使它工作。我理解这种情况会发生,因为宏会在调用它的函数中扩展,而sizeof会工作,因为它与变量x或y在同一范围内。我是对的吗?

如果我。请考虑以下情况。

void someComplexFunction(void* a, void* b){
 swap(a,b);
}

这是对的吗?我尝试了它,它的工作原理。为什么这有效?

1 个答案:

答案 0 :(得分:1)

您交换指针的地址但不是实际内容。

此代码显示

char *foo = "foo";
char *bar = "bar";

printf("before swap\n");
printf("foo address '%08x', foo content '%s'\n", foo, foo);
printf("foo address '%08x', foo content '%s'\n", bar, bar);

swap(foo, bar);

printf("after swap\n");
printf("foo address '%08x', foo content '%s'\n", foo, foo);
printf("foo address '%08x', foo content '%s'\n", bar, bar);

输出类似于此

before swap
foo address '010e58a8', foo content 'foo'
foo address '010e58ac', foo content 'bar'
after swap
foo address '010e58ac', foo content 'bar'
foo address '010e58a8', foo content 'foo'