Échangez n’importe quel type de deux variables dans c

Y at-il une logique dans c qui peut échanger n’importe quel type de deux variables. c’est-à-dire int, float, séquence de caractère.

Je peux penser à une logique de stocker chaque type de variables en tant que séquence de caractère et de l’échanger comme une chaîne normale, mais je n’ai pas sa bonne idée.

    Voyons comment vous feriez cela pour deux variables char . Vous feriez quelque chose comme ça.

     void swap(char* a, char* b) { char tmp = *a; *a = *b; *b = tmp; } 

    Pour deux variables int :

     void swap(int* a, int* b) { int tmp = *a; *a = *b; *b = tmp; } 

    Etc. Maintenant, pour répondre à tout type de variable, vous seriez tenté de faire:

     void swap(void* a, void* b) { // ... } 

    Mais vous devez allouer un espace d’une taille paramétrée. Donc, vous devez d’abord recevoir cette taille en tant que paramètre:

     void swap(void* a, void* b, size_t s) { // ... } 

    … que vous allez passer comme argument en utilisant une expression sizeof . Et vous devrez allouer cet espace et faire des assignations (copies) en utilisant cela. memcpy / free et memcpy viennent à l’esprit, c’est donc une façon grossière de faire ce que nous avons fait ci-dessus pour char et int , mais cette fois avec une taille paramétrée, ce serait:

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

    Comme je l’ai décrit, c’est un peu brut. Vous pouvez essayer de le faire avec alloca (qui alloue sur la stack) et non free .

    Vous pouvez également le faire avec une macro, car vous pouvez passer un type (au lieu d’un size_t ) à une macro, car les macros fonctionnent essentiellement en remplaçant du texte. Ensuite, vous pouvez évidemment créer le type de variable temporaire par son nom, comme ceci:

     #define swap_m(a, b, t) { t tmp = a; a = b; b = tmp; } 

    Évidemment, si vous ne voulez absolument pas transmettre d’informations sur les types impliqués, vous devrez faire preuve de plus de créativité.

    Vous pouvez utiliser une macro pour cela, mais cela ne fonctionnera pas pour tout:

     #define SWAP(a,b) { __typeof__(a) temp; temp = a; a = b; b = temp; }