Kompilieren mehrerer C-Dateien in einem Programm

Lesezeit: 4 Minuten

Benutzer-Avatar
Maria

Ich habe folgende zwei Dateien:

Datei1.c

int main(){
  foo();
  return 0;
}

Datei2.c

void foo(){

 }

Kann ich die beiden Dateien so zusammen kompilieren und verlinken file1.c wird die erkennen foo Funktion ohne Hinzufügen extern?

Prototyp aktualisiert.

gcc file1.c file2.c löst aus: Warnung: implizite Deklaration der Funktion foo.

  • gcc file1.c file2.cauch kenne ich die genauen Regeln von C für Funktionsaufrufe nicht, wenn es sich nicht um einen Prototyp handelt, aber Sie müssen möglicherweise hinzufügen int foo(); Oben main

    – Seth Carnegie

    4. Januar 2012 um 14:48 Uhr


  • @Seth: bitte immer -include -Wall wenn gcc-beispiele gegeben werden – es hilft, noobs in gute gewohnheiten zu bringen.

    – PaulR

    4. Januar 2012 um 14:54 Uhr

  • Ich habe die Frage aktualisiert. Ich mache es mit -Wall.

    – Maria

    4. Januar 2012 um 14:55 Uhr

Benutzer-Avatar
Sangeeth Saravanaraj

Der richtige Weg ist wie folgt:

file1.c

#include <stdio.h>
#include "file2.h"

int main(void){
    printf("%s:%s:%d \n", __FILE__, __FUNCTION__, __LINE__);
    foo();
    return 0;
}

file2.h

void foo(void);

file2.c

#include <stdio.h>
#include "file2.h"

void foo(void) {
    printf("%s:%s:%d \n", __FILE__, __func__, __LINE__);
    return;
}

output

$
$ gcc file1.c file2.c -o file -Wall
$
$ ./file 
file1.c:main:6 
file2.c:foo:6 
$ 

  • Die vordefinierte C99-Kennung lautet __func__. Ziehen Sie dies dem gcc-spezifischen vor __FUNCTION__.

    – pmg

    4. Januar 2012 um 15:18 Uhr

  • Ich denke nicht, dass es eine gute Praxis ist, den Header so an den Compiler zu übergeben – wenn er benötigt wird, bringt ihn der Präprozessor ein.

    – Timothy Jones

    4. Januar 2012 um 15:18 Uhr

  • @TimothyJones Entschuldigung. Das ist ein schöner Punkt. Danke, dass Sie die Antwort im Auge behalten! .. ich habe es jetzt korrigiert!

    – Sangeeth Saravanaraj

    4. Januar 2012 um 15:22 Uhr

  • Bitte auch immer angeben -Wall in jedem gcc-Befehlszeilenbeispiel.

    – PaulR

    4. Januar 2012 um 15:23 Uhr

  • @Minuet: Es weist den Compiler an, alle Warnungen zu aktivieren – Compiler-Warnungen sind wirklich hilfreich und wichtig, insbesondere für Leute, die die Sprache noch lernen, aber leider sind sie nicht standardmäßig aktiviert. Kompilieren Sie immer mit aktivierten Warnungen und achten Sie auf alle Warnungen die der Compiler weglässt.

    – PaulR

    19. November 2020 um 15:31 Uhr

Benutzer-Avatar
chrisaycock

Du brauchst keine externaber file1.c muss eine Deklaration sehen, dass foo() existiert. Normalerweise befindet sich diese Deklaration in einer Header-Datei.

Um eine Forward-Deklaration hinzuzufügen, ohne eine Header-Datei zu verwenden, ändern Sie einfach file1.c in:

int foo();  // add this declaration

int main(){
  foo();
  return 0;
}

  • kann ich es ohne Header-Dateien machen, indem ich einfach die beiden zusammen kompiliere?

    – Maria

    4. Januar 2012 um 14:56 Uhr

  • Sie benötigen noch eine Vorwärtsdeklaration von foo()was Sie in file1.c tun könnten, wenn Sie möchten.

    – Chrisaycock

    4. Januar 2012 um 14:58 Uhr

  • @mary ja, Header-Dateien sind für den Compiler, aber dies wird vom Linker erledigt

    – Seth Carnegie

    4. Januar 2012 um 14:59 Uhr

Benutzer-Avatar
Paul R

Du kannaber das solltest du nicht.

Verwenden Sie eine Header-Datei, file2.h:

// file2.h

void foo(); // prototype for function foo()

Dann füge hinzu:

#include "file2.h" 

in Datei1.c

Kompilieren:

$ gcc -Wall file1.c file2.c -o foo

Als allgemeine Regel ist es besser (robuster), eine Header-Datei zu verwenden, um die Schnittstelle von jedem Modul statt ad hoc Prototypen innerhalb abhängiger Module. Dies wird manchmal als SPOT-Prinzip (Single Point Of Truth) bezeichnet.

  • Du brauchst nicht extern Für den Aufruf einer Funktion benötigen Sie nur den Prototyp, wie z int foo(); in die Kopfzeile und den Körper hinein file2.c

    – Seth Carnegie

    4. Januar 2012 um 15:00 Uhr


  • @Seth: stimmt – das tust du nicht brauchen es, aber es ist nichts falsch daran, es explizit zu machen.

    – PaulR

    4. Januar 2012 um 15:02 Uhr


  • Ich habe noch nie jemanden gesehen, der eine Funktion erstellt hat extern nur weil es in einer anderen Datei ist. Ich sage dir kann, soll aber nicht Schreiben Sie eine Funktion in eine andere Datei, ohne sie zu verwenden extern auf dem Prototyp ist völlig unbegründet, es sei denn, Sie wissen etwas, was ich nicht weiß (was wahrscheinlich ist)

    – Seth Carnegie

    4. Januar 2012 um 15:04 Uhr


  • @Seth: überhaupt nicht – der Prototyp ist extern ob Sie es ausdrücklich erklären extern oder verwenden Sie die impliziten Regeln von C. Ich habe es dort hingestellt, um Noobs klar zu machen, dass es sich um einen Prototyp handelt, aber die meisten Leute verwenden das Explizite nicht extern Erklärungsformular in diesen Tagen.

    – PaulR

    4. Januar 2012 um 15:05 Uhr


  • Warum sagen Sie ihm dann, dass er keine Funktion schreiben soll, die in anderen Dateien verwendet werden soll, ohne zu schreiben extern? Das Wort “sollte nicht” ist hier zu stark

    – Seth Carnegie

    4. Januar 2012 um 15:06 Uhr


Es ist hässlich, aber mit gcc könnten Sie:

gcc -include file2.c file1.c

-include ist ein Flag für den Präprozessor, der den Inhalt von file2.c ganz oben in file1.c einschließt. Allerdings ist es eine schlechte Wahl und bricht für alle außer den einfachsten Programmen zusammen.

1226030cookie-checkKompilieren mehrerer C-Dateien in einem Programm

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

Privacy policy