3 Stimmen

Kompilieren mehrerer Quellen in C

Nehmen wir an, wir haben 2 Quelldateien:

main.c:

#include <stdio.h>
#define i 2

int main(){
    printf("sum(%d) = %d", i, sum(i));
    return 0;
}

Summe.c:

int sum(int i){
    int a, sum;
    for(a = 0, sum = 0; a < i; a++)
        sum += a;
    return sum;
}

Wenn ich sie kompiliere mit

gcc main.c sum.c 

Ich werde eine funktionierende ausführbare Datei erhalten. Ich bin verwirrt, weil ich dachte, dies sollte nicht funktionieren, da die sum Funktion kommt nach main > Es gibt keinen Hinweis auf die sum Funktion, wie in der Erklärung zuvor main .

Liegt das an einem der Kompilierungsschritte (z. B. Link-Editing)? Ist dies auch eine schlechte Praxis (hätte ich eine Header-Datei mit sum Erklärung)?

8voto

MByD Punkte 133514

Ich bin verwirrt, weil ich dachte, dies sollte nicht funktionieren, da die Summe Funktion nach main kommt > es gibt keinen Hinweis auf die Summenfunktion, wie sie vor main deklariert wird.

Wenn es keine Deklaration gibt, wird der Compiler setzt voraus. dass es eine solche Funktion gibt, die eine int (zum Glück ist das hier der Fall) und der Linker findet das benötigte Symbol, aber trotzdem...

Liegt das an einem der Kompilierungsschritte (z. B. Link-Editing)?

Nun ja, der Linker versucht, die nicht aufgelösten Symbole aus der Kompilierung aufzulösen.

Ist dies eine schlechte Praxis (sollte Deklaration verwenden sollen)?

Ja, das sollten Sie, oder deklarieren Sie die Funktion vor main.

2voto

vpit3833 Punkte 7653

Es hätten Header-Dateien verwendet werden sollen. Auf diese Weise können Sie Funktionen/API der Bibliotheken Ihres Programms in C exportieren.

Das Kompilieren funktioniert, weil der Linker nach der Definition der Funktion in den Dateien sucht, die auf die Datei folgen, in der sie verwendet wird. Da sie in sum.c gefunden wird, macht der Linker weiter und funktioniert.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X