这个问题已经在这里有一个答案:
- 实现通用互换宏C [复制] 6个回答
有没有在C可以交换任何类型的两个变量的任何逻辑。 即整数,浮点,字符的序列。
我能想到的每一个存储类型的变量作为characte的序列的逻辑和交换它像正常的字符串,但我没有它的好主意。
这个问题已经在这里有一个答案:
有没有在C可以交换任何类型的两个变量的任何逻辑。 即整数,浮点,字符的序列。
我能想到的每一个存储类型的变量作为characte的序列的逻辑和交换它像正常的字符串,但我没有它的好主意。
让我们来看看你怎么了两个做这个char
变量。 你会做这样的事。
void swap(char* a, char* b)
{
char tmp = *a;
*a = *b;
*b = tmp;
}
两个int
变量:
void swap(int* a, int* b)
{
int tmp = *a;
*a = *b;
*b = tmp;
}
等等。 现在,为了迎合任何类型的变量,你会想这样做:
void swap(void* a, void* b)
{
// ...
}
但是,你需要分配一个参数大小的空间。 所以,你必须先接收大小作为参数:
void swap(void* a, void* b, size_t s)
{
// ...
}
...您将通过为使用参数sizeof
表达式。 你还需要使用分配所述空间和做任务(复印件)。 把我的头顶部, malloc
/ free
和memcpy
浮现在脑海中,所以原始方法做什么,我们上面所做的char
和int
,但这次用一个参数的大小,应该是:
void swap_any(void* a, void* b, size_t s){
void* tmp = malloc(s);
memcpy(tmp, a, s);
memcpy(a, b, s);
memcpy(b, tmp, s);
free(tmp);
}
正如我所描述的,这是一个有点粗糙。 你可以尝试用做alloca
(其分配在栈上),没有free
。
或者,你可以用宏去做,因为你可以通过一个类型 (而不是size_t
)向宏-因为宏实质上是使用文本替换工作。 然后,你可以明显受到名称创建临时变量的类型,如下所示:
#define swap_m(a, b, t) { t tmp = a; a = b; b = tmp; }
显然,如果你不希望任何信息在所有涉及的种类通过,你必须更有创意了。
您可以使用宏为,但它不会一切工作:
#define SWAP(a,b) { __typeof__(a) temp; temp = a; a = b; b = temp; }