Salut !
J'ai remarqué que le compilateur MinGW arrivait à émettre des warnings (à juste titre), après qu'il ait détecté des incohérences dans le code... même dans des contextes où il n'est pourtant pas supposé y parvenir. Je m'explique.
Suite à une bidouille, j'ai remarqué que lors de l'utilisation de "printf", le compilateur arrivait à détecter les cas où un nombre non adéquat d'arguments étaient envoyés à la fonction. Or, le prototype de cette fonction indique pourtant qu'un seul argument minimum est obligatoire. En clair, le compilateur n'est pas supposé savoir combien d'arguments la fonction attend réellement.
Or, dans cet exemple :
le compilateur m'indique :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 #include <stdio.h> int main (void) { printf("%d %d %d",1,2,3,4); return 0; }Il y a bien sûr un argument de trop, là n'est pas le problème. Mais ce que je ne comprends pas, c'est que sachant que "printf" est une fonction pouvant prendre un nombre d'arguments variable et que ce nombre d'arguments qu'elle attend est (je suppose ?) géré par elle-même, qu'elle calcule en analysant et comptant le nombre de "code" de formatage (%d, %f, etc...) dans la chaîne de caractère du premier argument, comment le compilateur peut-il arriver à savoir si cette fonction reçoit bien le nombre d'arguments qu'elle attend, vu qu'il n'est pas censé connaître la fonction, ni la manière dont elle fonctionne ni de savoir comment elle gère ses arguments ? Car logiquement, il n'est pas censé le savoir. En effet, si dans la chaîne de caractères (son premier argument) la fonction voit "%d %d %d", après qu'elle l'ait analysée, elle voit qu'il y a 3 "codes" de formatage et elle attend alors un total de 4 arguments (le premier obligatoire + 3 autres). Mais le compilateur, comment fait-il pour le savoir ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 main.c: In function 'main': main.c:4: warning: too many arguments for format
Par conséquent, pour la fonction "printf" (et peut-être d'autres ?), y a t-il une astuce particulière qui permet au compilateur de compter le nombre d'arguments que la fonction attend réellement ?
Merci pour vos lumière !
Partager