Bonjour !
Ca fait un bail que j'ai plus posé de question mais là je suis devant un petit problème sans doute de conception de l'époque mais pas trouvé réellement d'alternative.
J'ai créé il y a bien 2 ans un objet String perso "C_Str" et je vais reprendre un peu le développement pour l'améliorer et voir peut-être même le compléter. Dans cet objet se trouve des fonctions de la famille printf genre:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| int C_Str_printf (C_Str * const format, ...)
{
int ret = -1;
va_list params;
if (format != NULL && format->sz_string != NULL && format->len > 0)
{
va_start (params, format->sz_string);
ret = vprintf (format->sz_string, params);
va_end (params);
}
return ret;
} |
L'objet de base est le suivant:
1 2 3 4 5
| struct _C_Str
{
char * sz_string;
size_t len;
}; |
Mon problème viens de la liste variable. Je sais que
La macro va_arg se développe en une expression qui a le type et la valeur de l'argument suivant de l'appel.
hors ici dans l'ouverture de la liste
va_start (params, format->sz_string);
le type n'est plus le même vu que le but est d'utiliser la chaîne contenu dans l'objet et non pas l'objet lui même et que pour une question de sécurité au niveau de la chaîne, seul l'objet peut être passé en argument aux fonctions car c'est un objet opaque.
Le compilateur me dit
D:\Programmation\Modules\C_Str\v2.3\c_str.c|765|warning: second parameter of `va_start' not last named argument|
ce qui est tout à fait normal
Bien sûr cela fonctionne quand même, testé sur la même machine, windows et linux mais est-ce que ca peut engendrer tôt ou tard chez d'autre personnes des comportements indéterminés ca, ca reste à savoir 
Enfin bref après cette présentation précise, quelles seraient les solutions, en tenant compte que le but final est d'avoir des fonctions comme printf (et les autres de la même famille) jusqu'au niveau de leur utilisation et tout en étant des fonction variadiques ? 
Merci pour vos suggestions/conseils
Partager