Ausimplementieren im Header
-
Hallo zusammen,
ich will gerade eine Bibliothek mit Templates und Funktionen schreiben.
Die Templates funktionieren einwandfrei. Die Funktionen muss ich ja im Header
ausimplementieren damit er sie beim Linken auch findet. Nur hat er die
Definition jetzt mehrfach, wenn ich Datei in verschiedenen Dateien inkludiere.
Gibt es ne andere Möglichkeit als die Funktion inline zu machen?Gruß,
*Cpp-Anfänger*
-
Verwende Include-Guards, also so:
// header.h #ifndef HEADER_H #define HEADER_H // hier die Funktionsprototypen, usw. #endif // HEADER_H
-
bei vc gibts auch #pragma once
-
Include Guards bringen doch auch nichts,
da ich die Implementierung ja immernoch mehrfach beim Linken habe...Ich hab jedenfalls nen Include Guard drum...
-
Cpp-Anfänger (off) schrieb:
Include Guards bringen doch auch nichts,
da ich die Implementierung ja immernoch mehrfach beim Linken habe...Ich hab jedenfalls nen Include Guard drum...
Jede Übersetzungseinheit sieht den Code nur einmal, das sollte also passen.
MfG SideWinder
-
Vielen Dank für eure Unterstüzung allerdings bringt bei mir der Include Guard gar nix...
Hier mal der vereinfachte Code:
myheader.h:
#ifndef _MYHEADER_H_ #define _MYHEADER_H_ /* inline */ void myfunc(){ // hier das inline und es funkt } #endifmyclass.h:
#include "myheader.h" class MyClass{ public: MyClass(); ~MyClass(); void func(); };myclass.cpp:
#include "myclass.h" MyClass::MyClass(){ } MyClass::~MyClass(){ } void MyClass::func(){ }main.cpp:
#include "myheader.h" #include "myclass.h" int main(int argc, char** argv){ MyClass mc; myfunc(); return 0; }Wahrscheinlich steh ich nur aufm Schlauch...
Fehlermeldung beim Linken: multiple definition of `myfunc()'
-
Versuch mal statt
#ifndef _MYHEADER_H_ #define _MYHEADER_H_das hier:
#ifndef MYHEADER_H_ #define MYHEADER_H_Hatte mit fuehrenden Underlines auch schon Probleme (VC++ 2005)
Viele Gruesse
-
__forceinline sollte helfen, mehrfach implementiert darf das nicht sein, da meckert der linker schon zurecht, es hilft nur wenn du inlinest (wie du scheinbar schon versucht hattest). alternativ bleibt nur die implementierung aus dem header zu nehmen und in eine implementierungsdatei zu packen und nur die deklaration im header zu lassen.
-
Dein Problem ist, dass main.cpp und myclass.cpp myclass.h includen, und in myclass.h hast Du keinen Guard.
Erweiter mal
#include "myheader.h" class MyClass{ public: MyClass(); ~MyClass(); void func(); };in
#ifndef MYCLASS_H #define MYCLASS_H #include "myheader.h" class MyClass{ public: MyClass(); ~MyClass(); void func(); }; #endifDann müsste es passen.
-
Hallo zusammen,
@schwudde: Die führenden Underlines waren es leider nicht...
@pub00515: Der include guard in MyClass würde nur eine Doppeldefinition von
MyClass verhindern@rapso: Ein Auslagern in eine .cpp würde die Doppelimplementierung verhindern,
allerdings möchte ich die Datei nicht in meinem Projekt haben, sondern
in einem Library-Verzeichnis. Und da kompiliert er die .cpp ja nicht mit, so dass
ich ein undefined reference beim Linken kriege.Viele Grüße,
*Cpp-Anfänger*
-
Kannst Du die Fkt. denn nicht in eine .cpp Datei schmeißen und die myheader.h includen, wo der Prototyp steht?
//myheader.h #ifndef MYHEADER_H #define MYHEADER_H void myfunc(); #endif//myfunc.cpp #include "myheader.h" void myfunc() { }Edit:
Aargh, zu wenig gelesen. Ja Du musst die Cpp Datei dann auf jeden Fall als Source Datei mit in das Projekt aufnehmen. Wo sie physikalisch liegt, ist jedoch egal.Oder Du includest die Cpp Datei. Ich _glaub_ das müsste auch funzen, solange sie eben nur einmal included wird.
-
Verwende inline (standard C++) für Funktionen oder __declspec(selectany) (MSVC spezifisch) für globale Daten.