C99 fonction inline .fichier c
J'ai défini ma fonction dans les .c (sans en-tête de déclaration) comme ici:
inline int func(int i) {
return i+1;
}
Puis, dans le même fichier ci-dessous je l'utilise:
...
i = func(i);
Et durant le lien que j'ai obtenu "undefined reference to 'func'". Pourquoi?
Soit faire
Voir aussi stackoverflow.com/questions/6312597
static
ou de fournir un non-inline définition que l'éditeur de liens peut trouver.Voir aussi stackoverflow.com/questions/6312597
OriginalL'auteur user14416 | 2013-04-26
Vous devez vous connecter pour publier un commentaire.
La
inline
modèle en C99 est un peu différent que la plupart des gens pensent, et, en particulier, différent de celui utilisé par le C++inline
est qu'une indication telle que le compilateur ne vous plaignez pas de doublement des symboles définis. Il ne garantit pas qu'une fonction inline, ni le fait qu'un symbole est généré, si c'est nécessaire. Pour forcer la génération d'un symbole vous aurais à ajouter une sorte de instanciation après lainline
définition:Vous devez généralement le
inline
définition dans un fichier d'en-tête, qui est ensuite inclus dans plusieurs .c fichiers (unités de compilation). Et que vous souhaitez seulement avoir la ligne ci-dessus exactement dans l'une des unités de compilation. Vous aurez probablement voir le problème que vous avez, parce que vous n'êtes pas à l'aide de l'optimisation de votre compilateur exécuter.Donc, votre cas d'utilisation, d'avoir la
inline
dans le .c fichier n'a pas beaucoup de sens, mieux d'utiliser seulementstatic
pour que, même supplémentairesinline
ne pas acheter de vous.extern
fichier-champ d'application de la déclaration sansinline
t de la force de la définition de ne pas être un en ligne unJ'ai une question, pourquoi cette situation se produit lorsque l'optimisation est éteint ? Quand je l'allume avec gcc -O1 option il suffit de compiler, ce que l'option de gcc optimisation de fournir ce code à compiler dans le bon chemin ?
lorsque vous compilez avec
-O0
, je suppose que vous dire que, gcc n'a généralement pas d'inline n'importe quelle fonction. Vous avez alors le ont les symboles définis quelque part, sinon il ne serait pas trouver un de lainline
déclarer des fonctions définies.merci pour la réponse, c'est vrai.
OriginalL'auteur Jens Gustedt
C99 inline sémantique est souvent mal compris. Le
inline
spécificateur sert à deux fins:Tout d'abord, comme un compilateur de l'indice en cas de
static inline
etextern inline
déclarations. La sémantique restent inchangés si vous supprimez le spécificateur.Ensuite, en cas de crue
inline
(c'est à dire sansstatic
ouextern
) afin de fournir une ligne de définition comme une alternative à une externe, qui doit être présent dans une autre unité de traduction. Ne pas donner l'externe est un comportement indéfini, qui normalement se manifeste que la liaison de l'échec.Ceci est particulièrement utile si vous voulez mettre une fonction dans une bibliothèque partagée, mais aussi de rendre le corps de la fonction disponibles à des fins d'optimisation (par exemple, d'inlining ou de spécialisation). En supposant suffisamment intelligent compilateur, ce qui vous permet de récupérer de nombreux avantages de modèles C++ sans avoir à passer par le biais de préprocesseur cerceaux.
Noter que c'est un peu plus bordélique que j'ai décrit ici comme ayant un autre fichier portée non en ligne déclaration externe va déclencher le premier cas, comme décrit dans Jens réponse, même si la définition elle-même est
inline
au lieu deextern inline
. C'est par la conception de sorte que vous pouvez avoir un single inline définition dans un fichier d'en-tête que vous pouvez inclure dans le fichier source qui fournit à l'externe par l'ajout d'une seule ligne pour la déclaration externe.En fait, en expliquant lorsque est ainsi sémantique utile est utile de répondre (au moins pour moi).
OriginalL'auteur Christoph
C'est à cause de la façon dont GCC poignée de la fonction inline. CCG effectue inline substitution, dans le cadre de l'optimisation.
Pour supprimer cette erreur d'utiliser
static
avant de la ligne.static
mot clé de forcer le compilateur à l'aide de mot-clé static force le compilateur à prendre cette fonction en ligne qui font le programme compile correctement.OriginalL'auteur Niloy Rashid