Funktion nicht gefunden

betaros

betaros

Computerspezi
Moin,

ich versuche zur Zeit Header und Präcompiler zu verstehen und stoße auf folgendes Problem:

test.cpp
Code:
#include <iostream>
#include "config.h"
#include "ausgabe.h"

using namespace std;

int main(){
    #ifdef breite
        cout << "Breite ist definiert" << endl;
    #endif

    #if defined(breite)
        cout << "Breite ist definiert 2" << endl;
    #endif

    ausgabe();

    if(breite == 80){
        cout << "Breite ist 80" << endl;
    }
}

config.h
Code:
#define breite 80

ausgabe.h
Code:
#ifdef breite
    void ausgabe();
#endif

ausgabe.cpp
Code:
#ifdef breite

#include <iostream>
using namespace std;

void ausgabe(){
    cout << "Die Breite ist definiert" << endl;
}

#endif

Mein Problem ist nun, dass er ausgabe() nicht aufrufen kann. Es kommt als Fehler:
Code:
$ g++ -Wall -o test test.cpp 
ausgabe.h:2:17: Warnung: inline-Funktion »void ausgabe()« verwendet, aber nirgendwo definiert [standardmäßig aktiviert]
/tmp/ccWHCkYg.o: In function `main':
test.cpp:(.text+0x52): undefined reference to `ausgabe()'
collect2: ld gab 1 als Ende-Status zurück

Ich verstehe nicht wieso er diese Funktion nicht finden kann, wenn ich es doch definiert habe ?(

Freue mich über jede Hilfe.

Viele Grüße
betaros
 
Zuletzt bearbeitet:
Hallo betaros,
du hast da was verwechselt den "#define breite 80" definiert die Konstante "breite" mit dem Wert 80. Das hat nicht mit einer Compileranweisung zu tun. Gewöhne dir generell bitte an Konstanten groß zu schreiben das macht es leichter Fehler zu finden. Compileranweisungen solltest du zur besseren Unterscheidung in der Form __BREITE__ anlegen.
Wenn du also jetzt in der Datei ausgabe.h die Funktion "DEKLARIERST" und nicht "DEFINIERST" und in config.h die Compileranweisung mit #define __BREITE__ anlegst sollte es klappen
 
Der Compiler wird die Funktion trotzdem nicht finden.

1. Sie sollte als "extern" in der Header-Datei stehen.
2. Der Compiler muss wissen wo er die Funktion findet, wenn sie nicht Teil der angegebenen Dateien ist. Also entweder baust du aus deiner ausgabe.cpp eine richtige Library, in der die Funktion ist und gegen die du linken kannst oder du gibst dem Compiler die ausgabe.cpp mit an.
3. Woher bekommt die ausgabe.h das Define aus der config.h? Der Code in '#ifdef breite' wird also niemals erreicht, würde ich tippen. Gleiches gilt für die ausgabe.cpp. Auch der Code dort wird nicht erreicht.

Fazit: Entferne die unsinnigen ifdef's in der ausgabe.cpp und ausgabe.h. Es reicht, wenn du den Check in der main() machst, denn dort ist die Konstante bekannt. Deklariere die Funktion als 'extern void ausgabe();' in der Header-Datei. Und gib die ausgabe.cpp dem Compiler mit an: g++ -Wall -o test test.cpp ausgabe.cpp

Richtig ist aber, dass ein #define auch eine Präprozessor-Direktive ist, eine mit der man Konstanten definiert. Sie wird bereits zum Zeitpunkt des Kompilierens ausgewertet und nicht beim eigentlichen Programm-Durchlauf. Fügst du also eine Funktion in Abhängigkeit zu einem #ifdef hinzu, das den Wert einer via #define definierten Konstante prüft, wird diese Funktion nur kompiliert, wenn die Konstante zum Zeitpunkt des Auftretens des #ifdef im Kompiliervorgang bereits bekannt ist. Beachte dabei, dass der Compiler aus jeder Source-Datei erstmal ein Objekt erstellt, das erst später über den Linker verbunden wird. Zumindest grob gesehen. ;)
 
Vielen Dank euch beiden für die Hilfe.

Ich habe jetzt versucht bitmunchers Hinweise anzuwenden und es hat wunderbar funktioniert. :)
 

Ähnliche Themen

String auf Konsole ausgeben

Problem mit Texteingabe

dynamische Speicherreservierung

deprecated conversion from string constant to ‘char*’

GetUserName Problem mit Visual C++

Zurück
Oben