Antwort

10

Ja printf() ohne einen richtigen Prototyp (aus den Standard-Header <stdio.h> oder von einer ordnungsgemäß schriftlichen Erklärung) Aufruf nicht definiertes Verhalten aufruft.

Wie in C11 Anhang J (nur informativ) dokumentiert

J2 nicht definiertes Verhalten

  • Für Aufruf einer Funktion ohne Funktionsprototyp in Umfang, wo die Funktion mit einer Funktion definiert ist, Prototyp, entweder der Prototyp endet mit einer Ellipse oder die Typen der Argumente nach der Promotion sind nicht kompatibel mit den Typen der Parameter (6.5.2.2).

Dieser Anhang ist nicht normativ, sondern dokumentiert deutlich den obigen Code als Beispiel für nicht definiertes Verhalten.

In pragmatischen Worten, in Abwesenheit eines Prototyps für printf, erzeugen die Compiler die Aufrufsequenz, als ob printf als int printf(const char*, int) definiert wurde, die ganz mit der tatsächlichen Umsetzung von printf in der Standardbibliothek unterschiedlich und inkompatibel sein kann, definiert als int printf(const char restrict *format, ...).

Ancient ABIs waren regulär genug, dass dies kein Problem verursachen würde, aber moderne (zB 64-Bit) ABIs verwenden effizientere Aufrufsequenzen, die den obigen Code definitiv falsch machen.

Als Folge dieses berühmte würde klassische C-Programm versagen, ohne die #include <stdio.h> oder zumindest ein geeigneter Prototyp für printf:

int main(void) { 
    printf("Hello world\n"); // undefined behavior 
    return 0; 
} 
+0

Minor Wortklauberei: Aufruf 'printf()' ohne einen richtigen Prototyp undefiniert ruft Verhalten. Ob es von '' kommt, spielt keine Rolle. Ein Programm kann alternativ eine eigene Prototyp-Deklaration von "printf" bereitstellen. – hvd

+0

@hvd: einverstanden, ich werde die Antwort umschreiben. Der Prototyp kann aus einer anderen Quelle stammen, muss aber mit der tatsächlichen Definition von 'printf' in der C-Bibliothek kompatibel sein. – chqrlie

+4

Nun, streng genommen ist die Antwort auf Ihre Frage (siehe Titel) * nein *. Wie Sie selbst darauf hinweisen, kann die Header-Datei [anstelle von '' durch eine * korrekt geschriebene Deklaration * ersetzt werden. – Matsmath

Verwandte Themen