Wie kann ich eine C-Funktion in einer Datei definieren und sie dann von einer anderen aufrufen?

Lesezeit: 2 Minuten

Benutzer-Avatar
Sam H

Wenn ich eine Funktion in der Datei definiere func1.cund ich möchte es aus der Datei aufrufen call.c. Wie kann ich diese Aufgabe erfüllen?

Sie würden eine Deklaration für die Funktion in die Datei einfügen func1.hund hinzufügen #include "func1.h" in call.c. Dann würden Sie kompilieren oder verlinken func1.c und call.c zusammen (Details hängen vom C-System ab).

  • oh ok, es ist eine ähnliche Schnittstelle in Java, es wäre besser, wenn C wie Java gemacht werden könnte

    – anshulkatta

    23. Juni 2016 um 7:44 Uhr

  • Vielleicht möchten Sie einen Blick auf C++/C# werfen

    – Wiegen

    7. September 2017 um 2:31 Uhr


Benutzer-Avatar
Merlyn Morgan-Graham

Verwenden ein Vorwärtserklärung

Zum Beispiel:

typedef struct
{
    int SomeMemberValue;
    char* SomeOtherMemberValue;
} SomeStruct;

int SomeReferencedFunction(int someValue, SomeStruct someStructValue);

int SomeFunction()
{
   SomeStruct s;
   s.SomeMemberValue = 12;
   s.SomeOtherMemberValue = "test string";

   return SomeReferencedFunction(5, s) > 12;
}

Es gibt eine Funktion, mit der Sie diese Forward-Deklarationen namens wiederverwenden können Header-Dateien. Nehmen Sie einfach die Forward-Deklarationen, platzieren Sie sie in der Header-Datei und verwenden Sie sie dann #include um sie zu jeder C-Quelldatei hinzuzufügen, in der Sie auf die Vorwärtsdeklarationen verweisen.

/* SomeFunction.c */

#include "SomeReferencedFunction.h"

int SomeFunction()
{
   SomeStruct s;
   s.SomeMemberValue = 12;
   s.SomeOtherMemberValue = "test string";

   return SomeReferencedFunction(5, s) > 12;
}

/* SomeReferencedFunction.h */

typedef SomeStruct
{
    int SomeMemberValue;
    char* SomeOtherMemberValue;
} SomeStruct;

int SomeReferencedFunction(int someValue, SomeStruct someStructValue);

/* SomeReferencedFunction.c */

/* Need to include SomeReferencedFunction.h, so we have the definition for SomeStruct */
#include "SomeReferencedFunction.h"

int SomeReferencedFunction(int someValue, SomeStruct someStructValue)
{
    if(someStructValue.SomeOtherMemberValue == NULL)
        return 0;

    return someValue * 12 + someStructValue.SomeMemberValue;
}

Um beide Quelldateien und damit die gesamte Bibliothek oder das ausführbare Programm kompilieren zu können, müssen Sie natürlich die Ausgabe beider .c-Dateien zur Linker-Befehlszeile hinzufügen oder sie in dasselbe “Projekt” ( je nach IDE/Compiler).

Viele Leute schlagen vor, dass Sie Header-Dateien für alle Ihre Forward-Deklarationen erstellen, selbst wenn Sie glauben, dass Sie sie nicht brauchen werden. Wenn Sie (oder andere Personen) Ihren Code ändern und die Signatur von Funktionen ändern, sparen sie Zeit, da sie nicht alle Stellen ändern müssen, an denen die Funktion vorwärts deklariert ist. Es kann Ihnen auch dabei helfen, einige subtile Fehler oder zumindest verwirrende Compilerfehler zu vermeiden.

  • Danke für die tolle Erklärung 😀

    – Sam H

    24. November 2010 um 21:51 Uhr

  • @Sam H: Beachten Sie auch, dass Sie die Vorwärtsdeklaration und die tatsächliche Definition in derselben Quelldatei haben können. Es wird immer noch funktionieren. Dies ist hilfreich für die Organisation des Codes, also tun Sie es nicht haben um Ihre Funktionen in der Reihenfolge zu schreiben, in der sie verwendet werden. Es ist auch hilfreich, wenn Sie zwei Funktionen haben, die sich gegenseitig aufrufen.

    – Merlyn Morgan-Graham

    24. November 2010 um 21:59 Uhr

1371190cookie-checkWie kann ich eine C-Funktion in einer Datei definieren und sie dann von einer anderen aufrufen?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy