2010-09-21 6 views
7

Ich habe einen Namespace mit Inline-Funktion, die verwendet wird, wenn mehrere Quelldateien. Beim Versuch, meine Anwendung zu verknüpfen, werden die Inline-Funktionen als doppelte Symbole gemeldet. Es scheint, als ob mein Code einfach nicht die Funktionen inline und ich frage mich, ob dies das erwartete Verhalten ist und wie man am besten damit umgehen.Inline-Funktion im Namespace erzeugen doppelte Symbole während der Verbindung auf gcc

Ich verwende die folgenden gcc Optionen: -g -Wextra -pedantic -Wmissing-Feld-initializers -Wredundant-decls -Wfloat-gleich -Wno-Neuordnungs -Wno-lang-lang Der gleiche Code Stil scheint zu kompilieren und ordnungsgemäß verknüpfen, wenn in einer VC7-Umgebung erstellt wird.

Das folgende Codebeispiel zeigt die Struktur des Codes:

/* 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

Ist eine globale Variable in jeder cpp-Datei in Ordnung? Das würde einen doppelten Symbolfehler verursachen. Unter der Annahme, dass es nicht global ist, ist Ihr Beispiel legales C++. Versuchen Sie, mit -Winline zu kompilieren. Welche Version von gcc verwendest du? –

+1

Bitte poste die eigentliche Compiler Nachricht. Tritt der Fehler bei minimalen Quelldateien auf (nur die erwähnten Zeilen ohne die durch ... implizierten Dinge)? –

+1

Nachdem ich einen der Namen von 'OK' in 'OK1' geändert habe, habe ich eine leere' main' Funktion hinzugefügt und den '...' entfernt; Das Kompilieren beider Dateien mit den von Ihnen angegebenen Optionen funktionierte für mich korrekt. Sie müssen mehr Details posten, da die Ursache Ihres Fehlers nicht hier ist. –

Antwort

-1

Das Inline-Schlüsselwort wird nur als Hinweis, welcher durch den Compiler genommen. Wenn der Compiler entscheidet, dass die Funktion ohne Inline besser funktioniert, wird sie nicht inline eingebunden. Es gibt herstellerspezifische Schlüsselwörter, die den Compiler inline zu einer Funktion machen - das ist __attribute__((always_inline)) für GCC und __forceinline für Visual C++.

Wenn Sie wirklich sicherstellen möchten, dass Ihre Funktion Linker-Fehler in allen Fällen auf allen Standard-Compilern nicht verursacht, möchten Sie sie vielleicht zu einem Template machen, da Template-Funktionen garantiert keine Linker-Fehler verursachen, selbst wenn sie in Headern definiert sind . Dies ist jedoch für wirklich einfache Funktionen ziemlich unnötig.

+2

Ihr Code verursacht keine Linkerfehler, wenn Sie ihn richtig schreiben. Schreibvorlagen, wo sie nicht benötigt werden, sind Unsinn. –

+1

Ob ein C++ - Compiler eine Funktion inliniert oder nicht, spielt hier keine Rolle. Der Compiler handhabt dies transparent unter der Als-ob-Regel. Nichtsdestoweniger beeinflusst "inline" die Semantik des Programms. Es ist hier angebracht, unabhängig davon, ob der Compiler tatsächlich die Funktion einfügt. Bitte recherchiere die "Eine-Definition-Regel". – sellibitze

+0

Gelöst: Ich hatte endlich die Zeit, um das Problem auf seine Wurzeln zu finden und (wie so oft) war es ein einfaches Konsistenzproblem mit der Verwendung von vorkompilierten Header. Ich habe gelernt, dass die Verwendung von Inline in der Tat transparent ist und nicht darauf achten muss, ob der Compiler tatsächlich die Funktion inline ausführt oder nicht. Und am wichtigsten: Verwenden Sie immer das Flag -Winvalid-pch, wenn Sie vorkompilierte Header verwenden. – doberkofler