7
votes

AVERTISSEMENT STRAND LLVM: Aucun prototype précédent pour fonctionner pour

Si j'ai manqué le prototype, Xcode (LLVM) vous invite à m'envoyer une erreur

Aucun prototype précédent pour la fonction d'exceptionHandler

mais pourquoi ils sont nécessaires dans mon code ci-dessous ? xxx


4 commentaires

Êtes-vous des préoccupations concernant la déclaration de méthode?


Est ExceptionnelHandler défini dans le même fichier que votre ApplicationDidfinishLaunching: Méthode? Et, est-ce défini avant son utilisation?


@ 一二三 Oui, tous les codes sont définis dans Appdelegate.m


@Davidschwartz Aucune erreur, juste l'avertissement LLVM Afficher si j'ai manqué le prototype de la fonction


4 Réponses :


7
votes

Si vous déclarez une fonction uniquement à utiliser dans ce fichier, préfixez la déclaration avec le mot-clé statique et que l'avertissement disparaisse. Comme c'est le cas, vous déclarez une fonction globale; théoriquement, il pourrait être appelé de n'importe où dans votre application. Mais comme vous l'avez donné, aucun prototype, personne d'autre ne pourrait l'appeler.

AVERTISSEMENT, si je comprends bien, essayez de vous faire clarifier vos intentions entre les fonctions statiques et les fonctions globales, et vous décourager de déclarer une fonction globale lorsque vous vouliez déclarer uniquement une statique.


2 commentaires

Oui, j'utilise comme fonction globale. Mais comme vous pouvez le constater, l'avertissement disparaît si je définis le prototype ** dans le même fichier **, donc je suppose que la visibilité est toujours la même?


Oui, la visibilité est la même chose, mais le compilateur voit désormais un prototype et suppose que tout le monde peut inclure le fichier avec le prototype s'il veut faire appel à l'appel. Autoriser uniquement un prototype dans un fichier .h pour étancher l'avertissement peut être meilleur, mais cela est plus rapide de détecter (du point de vue du compilateur) et tout aussi utile (à mon avis).



17
votes

du manuel de la GCC:

-wmissing-prototypes (c et objectif-c seul) strong> p>

Avertissez si une fonction globale est définie sans une déclaration de prototype antérieure. Cet avertissement est émis même si la définition elle-même fournit un prototype. L'objectif est de détecter des fonctions globales qui ne parviennent pas à être déclarées dans les fichiers d'en-tête. P> blockQuote>

Clang a emprunté cette option pour la compatibilité de la GCC, et parce que c'est utile (je présume ceci de la citation de Clang Devs). P>

L'option existe afin que vous puissiez vous empêcher de faire une erreur commune. qui peut être facilement évitée. Il est agréable d'être explicite sur la visibilité / le lien de la clarté / de l'intention. P>

En bref, vous avez demandé au compilateur de vous dire quand une définition non qualifiée ne correspond pas à une déclaration en activant cette option. Vous devez soit qualifier que comme externe code> et le rendre utilisable pour les autres (par exemple, mettez-le dans un en-tête) ou déclarez-le statique code>. Si vous utilisez C ++ en ligne code> est également une option. P>

Bien sûr, la visibilité implicite est bien connue, mais je trouve généralement l'option utile dans ces scénarios: P>

1) J'ai fait un typo: h3> xxx pré>

et p> xxx pré>

2) Je devrais être explicite sur la visibilité du symbole: xxx pré>

3) J'ai oublié #include code> l'en-tête qui a déclaré la fonction: h3> xxx pré>

AVERTISSEMENT: P>

// file.m
#include "file.h"

void MONExceptionHandler(NSException * exception) {
  …


0 commentaires

0
votes

Je pense que cela est le plus utile pour le code C ++. Par exemple, j'ai l'en-tête

void MyClass::hello() {
    cout << "hello";
}


0 commentaires

0
votes

Cet avertissement est alertant que vous ne pouvez pas appeler votre méthode à partir d'une autre méthode écrite ci-dessus. En C, l'ordre de la déclaration / des esprits de la mise en œuvre beaucoup et donne la différence entre quelque chose que vous pouvez accéder ou vous ne pouvez pas.


2 commentaires

La méthode qu'il appelle est placée ci-dessus. Votre réponse est techniquement correcte, mais inutile pour cette question. En outre, il y a 2 autres réponses correctes qui ont été publiées devant vous.


Je ne pense pas que je mérite A -1 pour donner une explication légèrement différente, mais la communauté décoque;)