/ / Sagt C11 etwas über leere Übersetzungseinheiten? Wenn ja, in welchem ​​Abschnitt? - c11

Sagt C11 etwas über leere Übersetzungseinheiten? Wenn ja, in welchem ​​Abschnitt? - c11

Ich kann nur die Grammatik der Übersetzungseinheit in Abschnitt 6.9 finden, die wie folgt lautet:

translation-unit: external-declaration
translation-unit external-declaration

Aus dieser Grammatik scheint es so zu seinmindestens eine externe Deklaration, was bedeutet, dass eine leere Übersetzungseinheit nicht erlaubt ist. Ich würde jedoch gerne wissen, was ein Compiler für ein solches Szenario benötigt. Kann mich jemand auf die Beschreibung in C11 hinweisen, wenn es eine gibt?

Antworten:

2 für die Antwort № 1

Angesichts dieser Definition von a ÜbersetzungseinheitDer Versuch, eine leere Quelldatei als Übersetzungseinheit zu behandeln, führt zu einem Syntaxfehler.

Abschnitt 5.1.1.3 des C11 - Standards (siehe N1570 Entwurf) erfordert eine Diagnose für eine Übersetzungseinheitdas verstößt gegen eine Syntaxregel oder -bedingung. Wenn die Diagnose eine nicht schwerwiegende Warnung ist und die Implementierung sie trotzdem übersetzt, ist das resultierende Verhalten durch Auslassung (4p2) nicht definiert. Wenn eine Implementierung keine Diagnosemeldung ausgibt, ist die Implementierung nicht konform (zumindest in dem Modus, in dem Sie sie aufgerufen haben), und der Standard hat dazu nichts mehr zu sagen.

Obwohl das Verhalten eines bestimmtenImplementation beantwortet nicht direkt Fragen zu dem, was der Sprachstandard sagt, hier ist, was gcc und clang mit einer leeren Quelldatei tun (mit Optionen, die sie anweisen, sich an C11 anzupassen):

$ gcc -c -std=c11 -pedantic-errors empty.c
empty.c:1:0: error: ISO C forbids an empty translation unit [-Wpedantic]
$ clang  -c -std=c11 -pedantic-errors empty.c
empty.c:1:1: error: ISO C requires a translation unit to contain at least one declaration [-Werror,-Wempty-translation-unit]
^
1 error generated.
$