2015-12-19 14 views
6

sto leggendo documentazione su pre-elaborazione gcc, ho letto la seguente frase (here):fine linea (documentazione GNU)

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.

cerco di produrre l'avviso facendo:

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

Ma nessun problema, compila. Capisco l'indicatore di fine riga come carattere di nuova riga, ma sembra che sia tutto il resto.

Come è possibile produrre l'avviso?

+3

'gcc -W'. Perché dovresti * mai * eseguire GCC senza avvisi ... –

+0

Probabilmente a nessuno importa di questa situazione. – bolov

+0

@KerrekSB è vero, ma l'uso di '-W' o' -Wall' sul suo esempio non produce ancora l'avviso documentato che sta descrivendo. Almeno non con 'gcc' versione 4.7.2. – lurker

risposta

5

Sembra che sia stato rimosso da gcc.

Vedi questo: 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

Inizialmente l'avvertimento sarebbe stato reso opzionale. La patch finale lo rimuove incondizionatamente. Dal momento che il comportamento non è definito, avrei preferito avere un'opzione per abilitare l'avviso. –

+0

Ancora (GCC 5.3.0) riceve un avviso (convertibile all'errore con '-Werror') per:' min.c: 1: 29: avvertimento: backslash-newline alla fine del file' per un file che termina con backslash- nuova linea. Se hai una barra rovesciata senza newline, ottieni 'min.c: 1: 1: error: stray '\' in program' (incondizionatamente un errore). Se hai backslash-newline-newline alla fine, non ci sono problemi (nessun errore o causa per averne uno). –

+0

Lo standard C dice in §5.1.1.2 Fasi di traduzione, ¶2 _ Ogni istanza di un carattere barra rovesciata ('\\') immediatamente seguita da un carattere di nuova riga viene eliminata, splicing linee di origine fisiche per formare linee di origine logiche. Solo l'ultima barra rovesciata su qualsiasi linea sorgente fisica può essere considerata parte di tale giunzione. Un file di origine che non è vuota termina in un carattere di nuova linea, che non deve essere immediatamente preceduto da un carattere di backslash prima di effettuare detto splicing prende place._ –

1

C11 (N1570), §5.1.1.2, stati:

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.

Quindi non avere una nuova riga alla del file viola il sopra "deve" limitare.

clang mette in guardia su di esso:

$ 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. 

Ma una violazione del vincolo è undefined behaviour.

C11 (N1570), § 4, stati:

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’’.

Così gcc preso la libertà di prendere le avvertenze (come notato da @nnn) come gcc è non richiesto di emettere diagnostica per comportamento indefinito.

Problemi correlati