zwei mal gleicher Funktionsname



  • Hallo zusammen,
    wie ist das eigentlich in C, wenn ich eine Datei einbinde, die heißt blub.h,
    also
    #include "blub.h"
    Die hat eine Funktion
    void blubber()

    Nun existiert diese Funktion in einer anderen Datei, die ich einbinde, auch schon mal. Da ich ja nicht mit Objekten arbeite, kann ich da ja nicht durch :: trennen (oder doch?)
    Wie erkläre ich das dem Compiler?
    Gruß,
    LS



  • garnicht.
    in C können 2 Funktionen nicht den selben Namen haben.

    Du könntest natürlich einen bösen hack machen:

    #define blubber my_blubber
    #include "blubber.h"
    #undef blubber
    

    um so blubber umzubenennen, aber machen würde ich das nicht wirklich...
    vorallem weil du das in der .cpp Datei ja auch machen musst und wenn das dann woanders aufgerufen wird, kommst du in teufels küche...



  • [quote="Shade Of Mine"]garnicht.
    in C können 2 Funktionen nicht den selben Namen haben.

    und wie ist das, wenn ich eine Datei blub.h einbinde und eine Datei gluck.h und in beiden Klassen ist eine Funktion
    void blubber.h definiert.
    GRuß,
    LS



  • In C gibt es keine Klassen

    mir ist aber nicht klar was du meinst.

    In C kann es keine 2 Funktionen mit gleichem Namen und nicht internal linkage geben.

    Sprich: wenn du
    static void f() {}
    in einer .c Datei schreibst, kannst du ein anderes f() auch noch woanders implementieren, denn durch das static bleibt f() lokal in dieser Übersetzungseinheit.

    Wenn du aber kein static davor hast, kannst du f() nicht 2mal implementieren, woher sollte der Linker wissen, welches f() du gemeint hast?

    deshalb verwendet man in C ja oft prefixe.



  • ich weiß, es gibt keine Klassen, ich sage es inzwischen automatisch, weil ich sonst immer mit Java programmiert habe.
    Mein Problem ist, dass ich eine Funktion aufrufe, die wird nicht erkannt. Wenn ich sie umbenenne (sowohl in der Datei, in der sie definiert ist, als auch dort, wo ich sie aufrufe), erkennt er sie. Insofern gehe ich davon aus, dass unter all den Dateien, die durch #include eingebunden wurden, noch mal eine Funktion mit demselben Namen existieren muss. Und ich weiß nicht, wie ich prinzipiell damit umgehen soll.
    Also nochmal, ich habe zwei Dateien blub.c und gluck.c und die dazugehörigen Header Dateien. In beiden ist eine Funktion blubber() definiert. Und nun habe ich eine dritte Datei schnappi.c, welche sowohl blub.c als auch gluck.c einbindet. Und irgendwo benutzt sie die Funktion blubber(), ich will aber, dass sie die von blub.c und nicht die von gluck.c benutzt.
    Gruß,
    LS



  • etwas konfus...

    nochmal: es ist technisch nicht möglich 2mal die gleiche funktion zu haben. da würder der linker schreien "mehrfachdefinition" weil man die Funktionen nicht unterscheiden kann.

    .c Dateien bindet man nicht ein, sondern nur .h dateien

    wenn eine funktion nicht gefunden wird, liegt das nicht daran, dass sie 2mal da ist, sondern dass der compiler oder linker sie 0mal vorfindet.



  • [quote="Shade Of Mine"]etwas konfus...

    nochmal: es ist technisch nicht möglich 2mal die gleiche funktion zu haben. da würder der linker schreien "mehrfachdefinition" weil man die Funktionen nicht unterscheiden kann.

    ok, damit kann ich jetzt was anfangen.

    .c Dateien bindet man nicht ein, sondern nur .h dateien
    das weiß ich, darum habe ich extra darauf verwiesen, dass die existieren. Vielleicht nicht klar genug.

    wenn eine funktion nicht gefunden wird, liegt das nicht daran, dass sie 2mal da ist, sondern dass der compiler oder linker sie 0mal vorfindet.[/quote]
    Warum findet er sie dann, wenn ich sie umbenenne?
    GRuß,
    LS



  • Ich glaube, hier wäre jetzt mal der tatsächliche Name der Funktion und die konkrete Fehlermeldung hilfreich.



  • ich tippe auf Präprozessor Magie.

    Du hast die Funktion zB

    void MessageBox(char* str);

    genannt und irgendwo windows.h eingebunden wo es ein
    #define MessageBox MessageBoxA

    gibt. Das define hast du beim Aufruf aber nicht, weshalb du versuchst MessageBox aufzurufen während die Funktion in wirklichkeit MessageBoxA heisst.

    so, oder so ähnlich könnte es sein.
    es kann aber auch an etwas total anderem liegen.


Anmelden zum Antworten