Appelle une fonction sans argument, bien qu’elle en ait besoin d’un

C’est K & R-C et voici le code: http://v6shell.org/history/if.c

Regardez la méthode principale. Il y a cette ligne “if (exp ())”.

Mais la fonction exp est déclarée comme: exp (s). Donc, il faut un argument.

Pourquoi ça marche? Et pourquoi voudriez-vous faire ça?

En fin de compte, il s’agit d’un bogue dans la commande de support du shell Unix V6, if .

Le code pour la fonction est:

 exp(s) { int p1; p1 = e1(); if (eq(nxtarg(), "-o")) return(p1 | exp()); ap--; return(p1); } 

Le paramètre de fonction s , implicitement de type int (comme c’est la fonction elle-même), est en fait inutilisé dans la fonction, le bogue est donc la présence de s , pas l’absence d’argument dans les appels à exp() . Tous les appels avec zéro argument réel sont corrects.

Si vous regardez la définition:

 exp(s) { int p1; p1 = e1(); if (eq(nxtarg(), "-o")) return(p1 | exp()); ap--; return(p1); } 
  1. s n’est pas utilisé
  2. C ne nécessite pas de vérification du type de temps de compilation. Il ne nécessite même pas de vérifier les parameters de la fonction. Tout est une / série d’octets

Pourquoi C ne fait aucune de ces vérifications? D’après ce que j’ai entendu dire, les ordinateurs étaient assez faibles au cours des premières années de C. Effectuer ces vérifications nécessiterait plusieurs passes pour parsingr le code source, ce qui augmente fondamentalement le temps de compilation d’une magnitude de n passes. Donc, il ne fait qu’une seule passe et prend chaque nom tel quel, c’est pourquoi la surcharge de fonctions n’est pas supscope

Donc, si les définitions utilisaient s d’une manière ou d’une autre, vous auriez probablement une horrible erreur d’exécution avec des sorties fantastiques sur la console

C’est parce que dans c

Le compilateur ne sera pas en mesure d’effectuer une vérification au moment de la compilation des types d’arguments et de l’arité lorsque la fonction est appliquée à certains arguments. Cela peut causer des problèmes

L’appel d’une fonction non déclarée est de style médiocre en C (voir ceci) et illégal en C ++

par exemple-

 #include void f(int x); int main() { f(); /* Poor style in C, invalid in C++*/ getchar(); return 0; } void f(int x) { printf("%d", x); } 

Ce programme fonctionnera mais ne devrait pas être utilisé.Voir ce lien Wiki pour plus d’informations.