Pourquoi le code suivant indique-t-il une erreur?

#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; }