2010-09-21 7 views
7

J'ai un espace de noms avec la fonction inline qui sera utilisé si plusieurs fichiers source. Lorsque j'essaie de lier mon application, la fonction inline est signalée en tant que symboles en double. Il semblerait que mon code n'intègre pas simplement les fonctions et je me demandais si c'était le comportement attendu et comment le gérer au mieux.fonction inline dans l'espace de noms génère des symboles en double pendant le lien sur gcc

J'utilise les options suivantes: gcc -g -Wextra -pedantic -Wmissing-terrain-initializers -Wredundant-decls -Wfloat-égale--Wno Réorganiser -Wno-long-long Le même style de code semble compiler et lien correctement lors de la construction dans un environnement VC7.

L'exemple de code suivant montre la structure du code:

/* header.h */ 
namespace myNamespace { 
inline bool myFunction() {return true;} 
} 

/* use_1.cpp */ 
#include "header.h" 
... 
bool OK = myNamespace::myFunction(); 
... 

/* use_2.cpp */ 
#include "header.h" 
... 
bool OK = myNamespace::myFunction(); 
... 
+1

Est-ce que OK est une variable globale dans chaque fichier cpp? Cela provoquerait une erreur de symbole en double. En supposant que ce n'est pas global, votre exemple est légal C++. Essayez de compiler avec -Winline. Quelle version de gcc utilisez-vous? –

+1

Veuillez poster le message du compilateur. Est-ce que l'erreur se produit avec des fichiers sources minimes (juste les lignes mentionnées sans les choses impliquées par ...)? –

+1

Une fois que j'ai changé l'un des noms de 'OK' à' OK1', ajouté une fonction 'main' vide et enlevé le' ... '; compiler les deux fichiers avec les options que vous avez fournies a fonctionné correctement pour moi. Vous devez poster plus de détails car la cause de votre erreur n'est pas ici. –

Répondre

-1

Le mot-clé en ligne est prise seulement comme un indice par le compilateur. Si le compilateur décide que la fonction serait meilleure sans inline, il ne l'insérera pas. Il existe des mots-clés spécifiques au fournisseur qui font du compilateur en ligne une fonction: __attribute__((always_inline)) pour GCC et __forceinline pour Visual C++. Si vous voulez vraiment vous assurer que votre fonction ne provoquera pas toujours des erreurs d'éditeur de liens sur tous les compilateurs standard, vous pourriez vouloir la rendre modélisée, car les fonctions modélisées sont garanties pour ne pas provoquer d'erreurs de liens même si elles sont définies dans les en-têtes . Ceci est, cependant, tout à fait inutile pour des fonctions vraiment simples.

+2

Votre code ne provoque pas d'erreur de lien si vous l'écrivez correctement. Écrire des modèles là où ils ne sont pas nécessaires est un non-sens. –

+1

Si un compilateur C++ inline une fonction ou non n'est pas important ici. Le compilateur gère cela de manière transparente sous la règle as-if. Néanmoins, 'inline' affecte la sémantique du programme. Il est approprié ici que le compilateur incorpore ou non la fonction. Veuillez rechercher la "règle de définition unique". – sellibitze

+0

RESOLU: J'ai finalement eu le temps de localiser le problème à ses racines et (comme souvent) c'était un problème de cohérence simple avec l'utilisation d'en-têtes précompilés. J'ai appris que l'utilisation d'inline est en fait transparente et ne nécessite pas de faire attention si le compilateur fait effectivement la fonction ou non. Et le plus important: utilisez toujours le drapeau -Winvalid-pch lorsque vous utilisez des en-têtes précompilés. – doberkofler

Questions connexes