2009-09-14 10 views
13

Pourquoi ai-je cet avertissement dans Qt Creator: `inline function 'bool Lion :: growl()' utilisé mais jamais défini?Qt Creator: "fonction inline utilisée mais jamais définie" - pourquoi?

J'ai vérifié mon code, et une déclaration

inline bool growl() à Lion (lion.h)

et la mise en œuvre correspondante lion.cpp:

inline bool Lion::growl()

Que se passe-t-il?

EDIT: Ma supposition a été qu'il est légal de définir la méthode inline réelle dans le fichier .cpp (le mot-clé inline avertit le compilateur de chercher le corps de la méthode ailleurs), ou est-ce que je me trompe?

Je ne veux pas encombrer mes fichiers d'en-tête avec des détails d'implémentation.

+0

note: Ce que j'ai appris que les fonctions inline sont implémentées dans le fichier d'en-tête (ou dans un fichier inl séparé qui est inclus en bas d'un en-tête). – RvdK

Répondre

26

Eh bien, je ne sais pas exactement le problème, mais pour commencer:

  • méthodes de ligne sont censées être mises en œuvre dans le fichier d'en-tête. Le compilateur doit connaître le code en ligne. L'utilisation du mot-clé "inline" dans la déclaration de la classe n'a aucun effet.
  • Mais ça ne peut pas faire mal non plus.

Voir aussi: c++ faq lite

+3

Personnellement (et c'est une question de goût), je * déteste * le code qui marque explicitement le code comme inline - soit avec le mot clé inline, soit en mettant l'implémentation dans le fichier d'en-tête pour 2 raisons: 2) ça blesse la performance - oui, vous m'avez entendu. Qui pensez-vous sait si l'introduction d'un mathod se traduira par une meilleure performance: le compilateur, ou le programmeur. Sérieusement les gens, faites confiance à vos optimiseurs, ils font un meilleur travail (dans de nombreux cas, mais pas tous) alors vous le ferez jamais. – Thomi

+7

@Thomi Si je ne fais que créer une enveloppe d'une ligne autour d'une fonction, je suis à peu près certaine que c'est mieux pour qu'elle soit en ligne. –

+0

Microsoft dit qu'ils peuvent obtenir une grande augmentation des performances dans les temps de liaison et la réduction de taille dans les bibliothèques statiques en appliquant cette règle: http://blogs.msdn.com/b/vcblog/archive/2014/09/26/feedback- make-zc-inline-default-pour-debug-release-configs-in-14.aspx – bames53

1

En plus de ce que Johan dit, vous ne pouvez pas avoir une définition distincte et la déclaration de la fonction, même si les deux sont dans le même fichier d'en-tête. Cela est vrai en particulier pour les fonctions membres des classes. Le code de fonction doit être de la forme:

class someClass 
{ 
void someFunc() 
{ ... } 
} 
// This will make the function inline even w/o the explicit 'inline' 

et non de la forme

class someClass 
{ 
public: 
    void someFunc(); 
} 

void someClass::someFunc() 
{ ... } 
+0

Vous pouvez réellement avoir une définition et une déclaration séparées: 'class C {inline void f(); } void C :: f() {} '. Vous devez juste utiliser explicite 'inline' plutôt qu'implicite. – bames53

3

méthodes de ligne sont censées être mises en œuvre dans le fichier d'en-tête. Le compilateur doit connaître le code pour le mettre en ligne.

Sauf si la fonction en ligne est utilisée dans le même projet, peut-être dans un autre fichier qui #include son en-tête. Il me semble qu'il y a une telle restriction pour les bibliothèques parce que restreindre les en-têtes aux prototypes de fonction rend les choses plus lisibles.

Qu'en est-il de #include -sur le .cpp?

+0

C++ requiert "Une fonction inline doit être définie dans chaque unité de traduction dans laquelle elle est utilisée." _n3337 basic.def.odr/3_ Cela signifie essentiellement que lorsqu'une fonction inline est déclarée dans un en-tête, elle doit également être définie dans l'en-tête. – bames53