2017-07-30 2 views
1
//File a.c 
void main() 
{ 
    test(); 
} 

//File b.c 
#include<stdio.h> 
void test() 
{ 
    printf("Hi, I am test."); 
} 

Ich kompiliere diesen Code mit "gcc a.c b.c". Dann führe ich "a.out" aus und die Ausgabe lautet "Hi, ich bin der Test". Meine Frage ist in einer .c-Datei gibt es keine Deklaration von test() also warum kompiliert der Code?Aufruf der Funktion in einer anderen Datei ohne Deklaration ergibt keinen Kompilierfehler

+0

sind diese verbunden? –

+1

Haben Sie eine Warnung gesehen? Wenn ich 'gcc' auf Ihrem Code verwende, sehe ich eine Warnung für eine" implizite Deklaration von 'test'". – lurker

+0

Kaufen Sie ein C-Tutorium Buch. Dann wirst du verstehen warum. Schalten Sie die Warnungen nicht aus –

Antwort

2

Die Funktionen in C sind extern standardmäßig a eine Funktion aus der Datei zu verbinden wäre der Linker Sinn der Lage b sogar zu nehmen, wenn es durch den Programmierer keine #include oder extern geschrieben sind.

Mein gcc kompiliert es mit dieser Warnung: warning: implicit declaration of function... Bedeutung, indem Sie sehen test(); der Compiler rät was test ist, und geht weiter. Wenn Sie festgelegt haben test als static würde, die seit static Zähler der Standard ausgefallen, hätte extern

Eines, was ich denke, Sie sollten ist beachten implicit declaration dies auch den Compiler macht erraten der Rückgabetyp von test, und es würde denken, der Typ ist int. Das könnte Probleme verursachen.

1

Der Code wird kompiliert, weil dies vom C-Standard gefordert wird (mindestens vor 1999). Die Unterstützung wurde im Standard 1999 weggelassen, obwohl eine Reihe von Compilern dies seither unterstützen - obwohl sie in solchen Fällen so konfiguriert werden können, dass sie warnen (z. B. über eine implizite Deklaration).

Aus Gründen der Rückwärtskompatibilität von C89/90 zu C vor dem Standard deklariert ein Versuch von Code zum Aufrufen einer Funktion implizit diese Funktion als int zurückgeben und eine Liste mit variablen Argumenten akzeptieren.

Dies ist, was passiert, wenn der Compiler durch A. C arbeitet

Bei der Verknüpfung, wird es funktionieren, da die Funktion den gleichen Namen hat.

Dies funktioniert in der Praxis, wenn die Art, wie die Funktion aufgerufen wird (die Verwendung des Rückgabewerts und die Anzahl der Argumenttypen), mit der Definition der Funktion übereinstimmt. Wenn es keine Übereinstimmung gibt, ist das Ergebnis möglicherweise nicht definiertes Verhalten. Wenn die Funktion beispielsweise mit 4 Argumenten definiert ist und alle 4 verwendet, der Aufrufer jedoch 3, ist das Verhalten nicht definiert. Wenn die Funktion so definiert ist, dass sie double zurückgibt, nimmt der Aufrufer jedoch an, dass sie int zurückgibt.

In der Regel sollten Sie alle Funktionen in allen Übersetzungseinheiten deklarieren, bevor sie aufgerufen werden (zB durch Einfügen eines Headers). Dies ermöglicht dem Compiler eine gewisse Überprüfung, ob die Art, wie eine Funktion aufgerufen wird, mit ihrer Deklaration übereinstimmt.

Beachten Sie auch, dass in allen C-Standards main()int, nicht void zurückgibt. Die Unterstützung von main(), die void zurückgibt, ist eine Compiler-Erweiterung.

Verwandte Themen