#include void m(); void n() { m(); } void main() { void m() { printf("hi"); } }
Lors de la compilation, une erreur
“référence indéfinie à m”
est montré. À quel m
est-il fait référence?
Tout d’abord, laissez-moi déclarer clairement,
Les fonctions nestedes ne sont pas standards. Ils sont supportés en tant qu’extension GCC.
OK, dans votre code, m()
est une fonction nestede dans main()
. C’est avoir une scope de bloc pour main()
seulement. En dehors de main()
autres fonctions ne peuvent pas voir l’existence de m()
, pas plus qu’elles ne peuvent appeler m()
directement. m()
ne peut être appelé que dans main()
.
Dans votre cas, l’appel de m()
dans n()
est à l’origine du problème. Même si vous avez fourni la déclaration suivante comme void m();
, l’éditeur de liens ne sera pas en mesure de trouver la définition de m()
et de jeter une erreur.
Solution: Déplacez la définition de m()
dehors de main()
, vous pouvez l’utiliser depuis n’importe quelle autre fonction.
Notez également que la signature recommandée de main()
est int main(void)
.
Comme cela a été expliqué par ailleurs, C ne prend généralement pas en charge les fonctions nestedes (gcc est une extension, mais presque aucun autre compilateur que je connaisse).
Vous devez déplacer la définition de m
dehors de main
. De préférence, vous devez définir m
avant son utilisation par n
:
#include void m() { printf("hi\n"); } void n() { m(); } int main( void ) // void main() is not a valid signature for main { n(); // call n, which calls m, which prints "hi" return 0; }