2015-12-19 8 views
6

I Dokumentation über gcc Vorverarbeitung gerade lese, lese ich den folgenden Satz (here):Zeilenende (GNU-Dokumentation)

If the last line of any input file lacks an end-of-line marker, the end of the file is considered to implicitly supply one. The C standard says that this condition provokes undefined behavior, so GCC will emit a warning message.

Ich versuche, um die Warnung zu erzeugen, indem Sie:

> echo -n "int main(void) {return 0;}" > test.c 
> gcc -Wall -Wextra -Werror test.c 

Aber kein Problem, kompiliert es. Ich verstehe End-of-Line-Marker als New-Line-Char, aber es scheint etwas anderes zu sein.

Wie könnte ich die Warnung erzeugen?

+3

'gcc -W. Warum würdest du jemals GCC ohne Warnungen laufen lassen ... –

+0

Wahrscheinlich interessiert sich niemand für diese Situation. – bolov

+0

@KerrekSB das ist wahr, aber die Verwendung von '-W' oder' -Wall' in seinem Beispiel ergibt immer noch nicht die dokumentierte Warnung, die er beschreibt. Zumindest nicht mit 'gcc' Version 4.7.2. – lurker

Antwort

5

Es scheint, dass es aus gcc entfernt wurde.

sehen: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=14331#c19

2007-05-31

PR preprocessor/14331 
    * lex.c (_cpp_get_fresh_line): Don't warn if no newline at EOF. 
+2

Ursprünglich sollte die Warnung optional gemacht werden. Der letzte Patch entfernt ihn bedingungslos. Da das Verhalten nicht definiert ist, hätte ich eine Option zum Aktivieren der Warnung bevorzugt. –

+0

Sie erhalten immer noch (GCC 5.3.0) eine Warnung (konvertierbar in Fehler mit '-Werror') für:' min.c: 1: 29: Warnung: Backslash-Newline am Dateiende' für eine Datei mit Backslash- Neue Zeile. Wenn Sie Backslash ohne Newline haben, erhalten Sie 'min.c: 1: 1: error: stray '\' in program' (unbedingt einen Fehler). Wenn Sie Backslash-Newline-Newline am Ende haben, gibt es kein Problem (kein Fehler oder Grund für einen). –

+0

Der C-Standard sagt in §5.1.1.2 Phasen der Übersetzung, ¶2 _Jede Instanz eines Backslash-Zeichens ('\\') unmittelbar gefolgt von einem neuen Zeilenzeichen wird gelöscht, wobei physische Quellzeilen zu logischen Quellzeilen verbunden werden. Nur der letzte Backslash auf einer physischen Quellzeile darf als Teil eines solchen Spleißes verwendet werden. Eine Quelldatei, die nicht leer ist, endet in einem Zeichen mit einer neuen Zeile, dem kein umgekehrter Schrägstrich vorangestellt werden darf, bevor ein solches Spleißen stattfindet. –

1

C11 (N1570), §5.1.1.2, Zustände:

A source file that is not empty shall end in a new-line character, which shall not be immediately preceded by a backslash character before any such splicing takes place.

Also nicht eine neue Zeile in der der Datei, die gegen die oben "soll" Einschränkung.

clang hat darüber warnen:

$ printf "int main(void) {return 0;}" > test.c 
$ clang -Weverything test.c 
test.c:1:27: warning: no newline at end of file [-Wnewline-eof] 
int main(void) {return 0;} 
         ^
1 warning generated. 

Aber eine Einschränkungsverletzung ist undefined behaviour.

C11 (N1570), §4, Zustände:

If a ‘‘shall’’ or ‘‘shall not’’ requirement that appears outside of a constraint or runtime constraint is violated, the behavior is undefined. Undefined behavior is otherwise indicated in this International Standard by the words ‘‘undefined behavior’’ or by the omission of any explicit definition of behavior. There is no difference in emphasis among these three; they all describe ‘‘behavior that is undefined’’.

So nahm gcc die Freiheit, die Warnungen zu nehmen (wie durch @nnn angegeben) als gcc ist nicht erforderlich jede auszustellen Diagnose für undefiniertes Verhalten.

Verwandte Themen