La raison pourquoi le compilateur ne peut pas fournir l'information nécessaire est tout simplement, parce que le compilateur n'est pas en cause ici. Le prototype des fonctions ne précise pas les types, parce que ces fonctions ont des types de variables. Si les types de données réels ne sont pas déterminés au moment de la compilation, mais au moment de l'exécution.
La fonction prend un argument à partir de la pile, après les autres. Ces valeurs n'ont pas de n'importe quel type d'information associés avec elle, de sorte que la seule façon, la fonction sait comment interpréter les données, en utilisant l'appelant a fourni de l'information, qui est la chaîne de format.
Les fonctions elles-mêmes ne savent pas quels types de données sont transmises, et ne savent pas le nombre d'arguments passés, il n'existe aucun moyen qu' printf
peut décider de cela sur son propre.
En C++, vous pouvez utiliser la surcharge d'opérateur, mais c'est tout un mécanisme différent. Car ici, le compilateur choisit la fonction appropriée en fonction du type de données disponibles et fonction surchargée.
Pour illustrer ceci, printf
, lors de la compilation ressemble à ceci:
push value1
...
push valueN
push format_string
call _printf
Et le prototype de l' printf
est-ce:
int printf ( const char * format, ... );
Donc, il n'y a pas d'informations de type reporté, à l'exception de ce qui est prévu dans la chaîne de format.