2016-07-22 58 views
2

Dies ist KEINE Frage, wie die "impliziten Deklaration der Funktion" Warnungen, die in C-Programmen, die answered oft schon aufgetreten ist, zu lösen.Warum ist "implizite Funktionserklärung" nur eine Warnung?

Ich verstehe, dass dies eine Compiler-Warnung ist, was ich frage mich, warum ist das eine Warnung und nicht ein Fehler? Wenn der Compiler die Funktion nicht sehen kann, was passiert, wenn die Funktion zur Laufzeit aufgerufen wird? Kann der Linker dieses Problem lösen? Oder sollen wir annehmen, dass das Verhalten des Aufrufens einer Funktion, die eine solche Warnung erzeugte, unbekannt ist?

+0

Sie müssen davon ausgehen, dass die Funktion eine beliebige Zahl oder Art von Argumenten annehmen und ein 'int' zurückgeben kann. Zumindest macht das der Compiler. Dies kann in zukünftigen Versionen der Spezifikation entfernt werden. – user3386109

+1

Die implizite 'int'-Regel ist nicht mehr im Standard ..., kann aber immer noch als Erweiterung funktionieren. Ich glaube nicht, dass es im aktuellen Standard irgendwas gibt, das besagt, dass der Compiler * keine 'int'-Rückgabe annehmen kann, es ist einfach nicht mehr nötig (und sollte eine Diagnose ausgeben). – Dmitri

Antwort

1

why is this a warning rather than an error?

Da es eine Menge Legacy-Code gibt, ist das so geschrieben. Compiler-Fehler wird es brechen.

If the compiler cannot see the function, what happens when the function is called at runtime? Does the linker ultimately resolve this issue?

Nehmen wir das Beispiel aussehen:

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

Wenn der Compiler arbeitet erzeugt seine eigene Funktion Signatur wie int foo(...) und sie verwenden. Übrigens kann es zu sehr neugierigen Fehlern führen. Die Objektdatei enthält also den Aufruf dieser Funktion und es ist in Ordnung. Wenn Sie versuchen, es zu verknüpfen, erhalten Sie einen Fehler: undefinierter Verweis auf `foo '. Aber wenn Sie ein anderes Modul mit foo Definition haben, wird der Linker es mit Namen finden und verknüpfen.

Or are we to assume that the behaviour of calling a function that produced such warning is unknown?

Wie gesagt kann es zu einigen seltsamen Fehlern führen. Stellen Sie sich vor, Sie haben Code wie int i = foo() und foo ist ohne Unterschrift. Und in einem anderen Modul haben Sie folgendes: int * foo(){...}. Wenn Sie Anwendungen im 64-Bit-Modus erstellen, werden Sie nur 32 Bit eines 64-Bit-Zeigers auf i setzen. Sie können also sagen, dass das Verhalten Ihres Programms unbekannt ist.

-1

Die Standard-Plätze nur sehr wenige Anforderungen an eine Implementierung in Bezug auf Diagnose:

5.1.1.3 Diagnostics

1     A conforming implementation shall produce at least one diagnostic message (identified in an implementation-defined manner) if a preprocessing translation unit or translation unit contains a violation of any syntax rule or constraint, even if the behavior is also explicitly specified as undefined or implementation-defined. Diagnostic messages need not be produced in other circumstances. 9)
9) The intent is that an implementation should identify the nature of, and where possible localize, each violation. Of course, an implementation is free to produce any number of diagnostics as long as a valid program is still correctly translated. It may also successfully translate an invalid program.
+0

Diese Antwort erklärt auch, warum Compiler Warnungen (und keine Fehler) für Verweise auf undefinierte globale Variablen ausgeben ... obwohl sie dies nicht tun. – immibis

0

Wegen der schädlichen Traditionen nach vorn von den Mainstream-Compiler durch, einschließlich der, die Sie verwenden. Zum Glück haben sie normalerweise Optionen, um es zu einem Fehler zu machen, wie -Werror=implicit-function-declaration für gcc und kompatible Compiler.