Lost in the matrix

C/C++/C#/Java, Multithreading

Voici une implémentation des varargs que j'ai fait dans
le train ce soir.
Elle n'est certes pas portable, mais elle
montre le principe de fonctionnement.
Idéal pour un cours de C.
_______________________________________________________________

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

# define Xva_list long *
# define Xva_start(L, X) (L) = (((Xva_list)(&(X))) + 1)
# define Xva_arg(L, T) (*(T *)(L++))

void test(int s, ...)
{
/* on déclare un pointeur pour stocker l'adresse dans la pile */
Xva_list list;

/* on récupère l'adresse de "s" que l'on décale de x octet */
/* x est égale a la taille en octet d'un pointeur. */
Xva_start(list, s);

/* on récupère nos arguments sur la pile */
printf("a = %d\n", Xva_arg(list, int));
printf("b = %c\n", Xva_arg(list, char));
printf("c = %s\n", Xva_arg(list, char *));
}

int main()
{
int a = 42;
char b = 'a';
char *c = strdup("chaine");

test(10, a, b, c);
free(c);
return (EXIT_SUCCESS);
}

0 commentaires:

Enregistrer un commentaire