34 votes

Déclaration implicite de la fonction - C99

Je suis actuellement en train d'utiliser Xcode 4, et dans mon fichier .pch j'ai cette macro: #define localize(s) NSLocalizedString((s), nil).
Quand j'essaie d'utiliser cette macro dans un fichier .m, je reçois cet avertissement: Déclaration implicite de la fonction 'localize' est invalide en C99.

Ce code compile sans problème, mais comment puis-je corriger cela pour ne pas obtenir d'avertissement?

0 votes

Je n'ai pas été en mesure de reproduire le problème, il se compile et s'exécute très bien, sans avertissements.

0 votes

Il semble que c'était un bug dans XCode... 4.0.2 je pense. Les versions bêtas 4.2 fonctionnent bien.

51voto

JPsnowytree Points 376

J'avais ce problème lorsque j'ai effectué un remplacement global de NSLog par DLog. J'ai bêtement inclus les

#define DLog(...) NSLog(...

déclarations, donc je me suis retrouvé avec

#define DLog(...) DLog(...

ce qui a provoqué des avertissements et une erreur de liaison.

34voto

Jens Points 17702

Les déclarations de fonctions implicites sont celles que le compilateur voit la première fois qu'elles sont utilisées en tant qu'appel de fonction (par opposition à celles pour lesquelles un prototype ou la définition de la fonction est vue en premier).

Apparemment, votre code utilisait localize(foo) mais la définition de macro n'était pas visible. Les raisons possibles : vous avez oublié d'inclure le fichier contenant la macro localize ou la précompilation des en-têtes a échoué et n'a pas inclus la macro localize de sorte qu'elle soit restée non développée.

3 votes

Mais cela indiquerait un bug dans Xcode, si le macro était défini dans l'en-tête de préfixe du projet, car cet en-tête devrait être précompilé et disponible pour toutes les unités de compilation (par exemple, chaque fichier .m dans le projet). Pour ce que ça vaut, je vois encore parfois ce bug dans Xcode 4.4.1, mais quitter et relancer Xcode le corrige.

2 votes

Cela pourrait probablement être classé sous "la précompilation des en-têtes a échoué". Avec des bugs dans les outils, tout peut arriver.

0 votes

J'ai vu cela se produire dans Xcode 5. Le moyen le plus sûr de se débarrasser du message d'avertissement est simplement d'inclure le fichier d'en-tête pertinent à l'intérieur du fichier montrant l'erreur.

2voto

Mazyod Points 6072

Une autre erreur "folle" à laquelle j'ai été confrontée était le fait que mon DLog était défini dans l'en-tête de préfixe de la cible iOS, j'ai donc dû le copier dans le préfixe de la cible OSX, aussi...

1voto

Ivan Points 286

Dans mon cas, seul un fichier donnait cette erreur. Il s'est avéré que je l'avais ajouté à l'appartenance de la cible des tests du projet (dans l'inspecteur de fichiers sur la droite).

1voto

badcat Points 6262

J'ai eu ce problème parce que j'ai accidentellement importé CocoaLumberjack de cette manière :

#import 

Apparemment, l'équipe de CocoaLumberjack a davantage modularisé le code ; et des macros comme DDLogError sont maintenant définies séparément dans leur propre fichier d'en-tête.

J'ai remplacé l'instruction d'importation par ceci et l'erreur a disparu :

#import

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X