"No hay nueva línea al final del archivo" advertencia del compilador


¿Cuál es el motivo de la siguiente advertencia en algunos compiladores de C++?

No hay nueva línea al final del archivo

¿Por qué debería tener una línea vacía al final de un archivo fuente/encabezado?

Author: Brian Tompsett - 汤莱恩, 2008-09-16

11 answers

Piense en algunos de los problemas que pueden ocurrir si no hay una nueva línea. De acuerdo con el estándar ANSI, el #include de un archivo al principio inserta el archivo exactamente como está al frente del archivo y no inserta la nueva línea después del #include <foo.h> después del contenido del archivo. Por lo tanto, si incluye un archivo sin nueva línea al final del analizador, se verá como si la última línea de foo.h estuviera en la misma línea que la primera línea de foo.cpp. ¿Y si la última línea de foo.h fue un comentario sin una nueva línea? Ahora la primera línea de foo.cpp está comentada. Estos son solo un par de ejemplos de los tipos de problemas que pueden surgir.


Solo quería señalar a las partes interesadas la respuesta de James a continuación. Si bien la respuesta anterior sigue siendo correcta para C, el nuevo estándar de C++ (C++11) se ha cambiado para que esta advertencia ya no se emita si se usa C++ y un compilador conforme a C++11.

Del estándar C++11 a través del post de James:

Un archivo fuente que no está vacía y que no termina en un carácter de nueva línea, o que termina en un carácter de nueva línea inmediatamente precedido por un carácter de barra invertida antes de que se lleve a cabo cualquier empalme, se procesará como si se agregara un carácter de nueva línea adicional al archivo (C++11 §2.2/1).

 197
Author: TJ Seabrooks,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-09 12:56:50

El requisito de que cada archivo de origen termine con una nueva línea no escapada se eliminó en C++11. La especificación ahora dice:

Un archivo fuente que no está vacío y que no termina en un carácter de nueva línea, o que termina en un carácter de nueva línea inmediatamente precedido por un carácter de barra invertida antes de que se realice cualquier empalme, se procesará como si se agregara un carácter de nueva línea adicional al archivo (C++11 §2.2/1).

Un compilador conforme debe no más tiempo emitir esta advertencia (al menos no cuando se compila en modo C++11, si el compilador tiene modos para diferentes revisiones de la especificación del lenguaje).

 39
Author: James McNellis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-11-17 18:30:36

C++03 Standard [2.1.1.2] declara:

... Si un archivo de origen que no está vacío no termina en un carácter de nueva línea, o termina en un carácter de nueva línea inmediatamente precedido por un carácter de barra invertida antes de que se lleve a cabo cualquier empalme, el comportamiento es indefinido.

 22
Author: Igor Semenov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-06 08:57:34

La respuesta para el "obediente" es "porque el estándar C++03 dice que el comportamiento de un programa que no termina en nueva línea es indefinido" (parafraseado).

La respuesta para los curiosos está aquí: http://gcc.gnu.org/ml/gcc/2001-07/msg01120.html.

 15
Author: Vytautas Shaltenis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-06 08:57:43

No se refiere a una línea en blanco, es si la última línea (que puede tener contenido en ella) termina con una nueva línea.

La mayoría de los editores de texto colocarán una nueva línea al final de la última línea de un archivo, por lo que si la última línea no tiene uno, existe el riesgo de que el archivo se haya truncado. Sin embargo, hay razones válidas por las que es posible que no desee la nueva línea, por lo que es solo una advertencia, no un error.

 6
Author: Leigh Caldwell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-16 13:40:39

#include reemplazará su línea con el contenido literal del archivo. Si el archivo no termina con una nueva línea, la línea que contiene el #include que sacó en fusionará con la línea siguiente.

 5
Author: moonshadow,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-12-22 22:59:39

Estoy usando c-free IDE versión 5.0,en mi progrm ya sea de lenguaje 'c++' o 'c' estaba teniendo el mismo problema.Solo al final del programa es decir, la última línea del programa(después de llaves de función puede ser principal o cualquier función), presione enter-línea no. se incrementará en 1.luego ejecute el mismo programa, se ejecutará sin error.

 2
Author: divesh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-12-11 09:47:33

Por supuesto, en la práctica cada compilador agrega una nueva línea después del #include. Afortunadamente. - @mxcl

No es C/C++ específico sino un dialecto C: cuando se usa la extensión GL_ARB_shading_language_include el compilador glsl en OS X advierte NO sobre una nueva línea que falta. Así que puede escribir un archivo MyHeader.h con un protector de encabezado que termina con #endif // __MY_HEADER_H__ y perderá la línea después de #include "MyHeader.h" con seguridad.

 2
Author: Jan-Philip Loos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-12-23 16:47:51

Porque el comportamiento difiere entre las versiones de C/C++ si file no termina con new-line. Especialmente desagradable es más viejo C++-versiones, fx en C++ 03 el estándar dice (fases de traducción):

Si un archivo fuente que no está vacío no termina en una nueva línea carácter, o termina en un carácter de nueva línea inmediatamente precedido por un carácter de barra invertida, el comportamiento es indefinido.

El comportamiento indefinido es malo: un compilador de conformidad estándar podría hacer más o menos lo que quiere aquí (insertar código malicioso o lo que sea) - claramente una razón para la advertencia.

Si bien la situación es mejor en C++11, es una buena idea evitar situaciones en las que el comportamiento no esté definido en versiones anteriores. La especificación C++03 es peor que C99 que prohíbe directamente tales archivos (el comportamiento se define entonces).

 1
Author: skyking,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-06 08:43:25

Esta advertencia también podría ayudar a indicar que un archivo podría haber sido truncado de alguna manera. Es cierto que el compilador probablemente lanzará un error de compilador de todos modos, especialmente si está en el medio de una función, o tal vez un error de enlazador, pero estos podrían ser más crípticos, y no se garantiza que ocurran.

Por supuesto, esta advertencia tampoco está garantizada si el archivo se trunca inmediatamente después de una nueva línea, pero todavía podría detectar algunos casos que otros errores podrían fallar, y da una una pista más fuerte al problema.

 0
Author: mwfearnley,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-01-07 16:19:58

Eso no es un error. Es sólo una advertencia.

Abra el archivo en un editor, vaya a la última línea del archivo y presione enter para agregar una línea en blanco al final del archivo.

Aunque, además de eso, deberías usar #include <iostream> en lugar de <iostream.h>. Luego ponga un using std::cout; después de él.

 -3
Author: keya,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-11-16 15:18:02