Funktion nicht gefunden

Dieses Thema im Forum "C/C++" wurde erstellt von betaros, 17.03.2014.

  1. #1 betaros, 17.03.2014
    Zuletzt bearbeitet: 17.03.2014
    betaros

    betaros Computerspezi

    Dabei seit:
    02.02.2008
    Beiträge:
    181
    Zustimmungen:
    0
    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
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. #2 developer, 17.03.2014
    developer

    developer Grünschnabel

    Dabei seit:
    12.01.2010
    Beiträge:
    9
    Zustimmungen:
    0
    Ort:
    Lübeck
    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
     
  4. #3 bitmuncher, 18.03.2014
    bitmuncher

    bitmuncher Der Stillgelegte

    Dabei seit:
    08.05.2007
    Beiträge:
    3.171
    Zustimmungen:
    0
    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. ;)
     
  5. #4 betaros, 19.03.2014
    betaros

    betaros Computerspezi

    Dabei seit:
    02.02.2008
    Beiträge:
    181
    Zustimmungen:
    0
    Vielen Dank euch beiden für die Hilfe.

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

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
Thema:

Funktion nicht gefunden

Die Seite wird geladen...

Funktion nicht gefunden - Ähnliche Themen

  1. CentOS 7.2: Mailversand funktioniert obwohl nicht definiert

    CentOS 7.2: Mailversand funktioniert obwohl nicht definiert: Hallo Habe CentOS 7.2 installiert/konfiguriert. Testweise habe ich eine mail versendet: mail -s "test mail" email@adresse.de May 25 15:45:04...
  2. Samba 4.1.11 Domänen anbindung funktioniert nicht !!!

    Samba 4.1.11 Domänen anbindung funktioniert nicht !!!: Hallo liebe Ubixboard - User, ich hoffe ihr könnt mir helfen habe schon mehrere Foren durchstöbert und echt zahlreiche Tutorials angeschaut und...
  3. PHPmyAdmin login funktioniert nicht

    PHPmyAdmin login funktioniert nicht: Hallo zusammen, nachdem ich gestern meine PHP Version von 5.3 auf 5.4 geupdated habe, kann ich mich nicht mehr in PHPmyAdmin einloggen. Komisch...
  4. Tabs wiederherstellen funktioniert bei Firefox nicht

    Tabs wiederherstellen funktioniert bei Firefox nicht: Hallo, seit kurzem kann ich in Firefox keine geschlossenen Tabs wiederherstellen. Wenn ich auf den entsprechenden Button klicke, passiert...
  5. Automatisierung via Netzwerk funktioniert nicht richtig

    Automatisierung via Netzwerk funktioniert nicht richtig: Hey Leute, Habe da ein Problem das ich einfach nicht verstehe und wo ich auch nicht weis wonach ich suchen soll, folgender Code: #!/bin/bash...