Je travaille actuellement en langage C sur Ubuntu 18.04. Je n'utilise aucun IDE.

#include <stdio.h>

void main()
{
    message();
    printf("\nCry, and you stop the monotomy!\n");
}

void message()
{
    printf("\nSmile, and the worldsmiles with you...");
}

Lorsque je l'exécute, il renvoie le message d'erreur comme suit.

msg.c: In function ‘main’:

msg.c:5:2: warning: implicit declaration of function ‘message’ [-Wimplicit-function-declaration]

  message();

  ^~~~~~~

msg.c: At top level:

msg.c:8:6: warning: conflicting types for ‘message’

 void message()

      ^~~~~~~

msg.c:5:2: note: previous implicit declaration of ‘message’ was here

  message();

  ^~~~~~~

Lorsque je mets la fonction de message au-dessus de main(), cela ne montre aucune erreur. Pourquoi ça? Ne pouvons-nous pas mettre des fonctions après main()? Qu'est-ce qu'une déclaration implicite ici?

3
KRISHNA I 20 nov. 2018 à 19:07

4 réponses

Meilleure réponse

Vous pouvez mettre des fonctions après main si vous le souhaitez; juste si vous les appelez en main, avant qu'ils ne soient définis, vous devez également les déclarer avant main:

void message();
void main()
...

Sans cela, le compilateur suppose que message est une fonction liée extérieurement renvoyant int, puis quand il rencontre votre définition réelle de message, il se plaint des types en conflit pour message ( car il a déjà décidé que le message renvoie int, pas void).

5
Govind Parmar 20 nov. 2018 à 16:10

Vous devez d'abord définir ou déclarer votre méthode, avant de l'appeler. Dans l'exemple suivant, je déclare la méthode avant de l'appeler dans main:

#include<stdio.h>

// Declare the method
void message();

void main()
{
    // Call the method
    message();
    printf("\nCry, and you stop the monotomy!\n");
}

// Define the method
void message()
{
    printf("\nSmile, and the worldsmiles with you...");
}

PS: je changerais le type de retour de main() en int. Pour en savoir plus, consultez Que devrait retourner main () en C et C ++?

3
gsamaras 20 nov. 2018 à 16:09

Lorsque je mets la fonction de message au-dessus de main (), elle ne montre aucune erreur. Pourquoi ça? Pouvons-nous mettre des fonctions après main ()?

Les fichiers source C sont analysés de haut en bas. Donc, au moment où le compilateur voit l'appel de fonction message (dans main), il doit le savoir (la même chose s'applique à tout symbole, en gros). C'est pourquoi le mettre au-dessus fonctionne mais en dessous des résultats en diagnostics.

Au minimum, vous devez fournir une déclaration pour tout identifiant avant son utilisation.

Qu'est-ce qu'une déclaration implicite ici?

Lorsque le compilateur voit un appel de fonction et n'en a pas connaissance, il suppose que la fonction renvoie un int (comme int message();). C'est la "déclaration implicite". C'était une règle ancienne qui était valide jusqu'à C99.

Mais dans C99 et versions ultérieures, cette règle a été supprimée. Ainsi votre code (qui met la définition de "message" sous main sans déclaration) n'est pas valide dans C99 et les versions ultérieures. Voir Appels de fonction C: Comprendre la règle "implicite int".

Plus tard, quand le compilateur voit la définition réelle de message (c'est-à-dire void message() {...), il voit que le type de retour est en fait void. Ainsi ceci entre en conflit avec sa propre déclaration (où il a supposé son int). Cela génère donc:

msg.c:8:6: warning: conflicting types for ‘message’
0
usr 20 nov. 2018 à 16:28

Lorsque le compilateur arrive à message(); (en main), le compilateur ne sait rien de la fonction message.

Il fait maintenant de son mieux. Donc, il vous donne un avertissement et suppose ensuite que message aurait dû être déclaré int message();

Donc, quand le compilateur arrive enfin à void message() - il dit "bonjour - je pensais que ce serait int messgae". D'où l'avertissement.

Mettez simplement message avant main, donc quand il s'agit de compiler main, le compilateur connaît message.

Ou comme l'ont dit d'autres affiches. Déclarez-le en haut.

0
Ed Heal 20 nov. 2018 à 16:22