c - sizeof 在宏和函数中的区别

标签 c macros

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

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

这样对吗?我试过了,它奏效了。为什么会这样?

最佳答案

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

这段代码展示了它

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'

关于c - sizeof 在宏和函数中的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28385697/

相关文章:

c++ - 衡量标准是什么?为什么程序员应该关心? - 联网

c - 我如何让这个 C 代码工作?

将 float RGBA 转换为 int RGB

c - unistd.h 读取()函数 : How to read a file line by line?

c++ - C++ 宏中的模板?

c - 如何排除 'for' 内的数字

macros - 用于父脚本的 Macroexpand

macros - 使用宏获取 Haxe 函数参数类型的最佳方法是什么?

parsing - 为什么我不能在返回位置使用大括号式宏表达式的方法?

c - 宏 if 语句返回错误 : operator '&&' has no right operand