Pregunta

¿Cuál es la razón por la siguiente advertencia en algunos compiladores de C++?

No newline at end of file

¿Por qué debo tener una línea en blanco al final de una fuente/archivo de cabecera?

¿Fue útil?

Solución

Piensa en algunos de los problemas que pueden ocurrir si no hay ningún salto de línea.De acuerdo con el estándar ANSI el #include de un archivo al principio inserta el archivo exactamente como está al frente de el archivo y no insertar la nueva línea después de la #include <foo.h> después de que el contenido del archivo.Así que si usted incluye un archivo con ninguna de nueva línea al final para el analizador será visto como si la última línea de foo.h está en la misma línea que la primera línea de foo.cpp.¿Qué pasa si la última línea de foo.h era un comentario sin una nueva línea?Ahora la primera línea de foo.cpp está comentado.Estos son sólo un par de ejemplos de los tipos de problemas que pueden aparecer de repente.


Sólo quería apuntar todas las partes interesadas a la respuesta de Santiago a continuación.Mientras que la respuesta anterior es correcta para C, el nuevo estándar de C++ (C++11) ha sido cambiado, por lo que esta advertencia no debería ser emitido si el uso de C++ y un compilador conforme a la de C++11.

A partir de C++11 estándar a través de James' post:

Un archivo de código fuente que no está vacío y que no termine en una nueva línea de carácter, o que termina en una nueva línea de carácter inmediatamente precedido por un carácter de barra invertida antes de que cualquier empalme se lleva a cabo, será tratado como si de un adicional nueva línea de caracteres se anexa al archivo de C++11 §2.2/1).

Otros consejos

El requisito de que cada archivo de código fuente final con un no escapó de la nueva línea fue eliminado en C++11.La especificación ahora lee:

Un archivo de código fuente que no está vacío y que no termine en una nueva línea de carácter, o que termina en una nueva línea de carácter inmediatamente precedido por un carácter de barra invertida antes de que cualquier empalme se lleva a cabo, será tratado como si de un adicional nueva línea de caracteres se anexa al archivo de C++11 §2.2/1).

Un conformes compilador no debería problema esta advertencia (al menos no cuando se compila en C++11 modo, si el compilador tiene modos para diferentes revisiones de la especificación del lenguaje).

C++03 Estándar [2.1.1.2] declara:

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

La respuesta para el "sujeto" es "porque el C++03 Norma dice que el comportamiento de un programa, no termina en el salto de línea no está definido" (parafraseado).

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

No es en referencia a una línea en blanco, si la última línea (que pueden tener los contenidos en ella) se termina con un salto de línea.

La mayoría de los editores de texto que se va a poner un salto de línea al final de la última línea de un archivo, así que si la última línea no tiene uno, hay un riesgo de que el archivo ha sido truncada.Sin embargo, hay razones válidas por las que no desea que la nueva línea de lo que es sólo una advertencia, no un error.

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

Estoy usando c-libre IDE versión 5.0,en mi progrm cualquiera de 'c++' o 'c' lenguaje el que estaba el mismo problema.Sólo al final del programa es decir,la última línea del programa(después de llaves de la función puede ser principal o de cualquier función),presione entrarlínea no.aumenta en 1.a continuación, ejecutar el mismo programa,se ejecuta sin errores.

Por supuesto, en la práctica, cada compilador añade una nueva línea después de la #include.Afortunadamente.– @mxcl

no específica de C/C++ pero un C dialecto:cuando se utiliza el GL_ARB_shading_language_include la extensión de la glsl compilador en OS X te advierte NO sobre la ausencia de una nueva línea.Así que usted puede escribir un MyHeader.h archivo con un encabezado de la guardia, que termina con #endif // __MY_HEADER_H__ y usted se perder la línea después de la #include "MyHeader.h" para asegurarse.

Debido a que el comportamiento difiere entre C/C++ versiones si el archivo no termina con la nueva línea.Especialmente grave es mayor en C++versiones, fx en C++ 03 la norma dice (traducción fases):

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

Un comportamiento indefinido es malo:un estándar conforme compilador podría hacer más o menos lo que quiere aquí (insertar malicous código o lo que sea), sin duda una razón de la advertencia.

Mientras que la situación es mejor en C++11 es una buena idea para evitar situaciones donde el comportamiento no está definido en versiones anteriores.El C++03 especificación es peor que C99 que de plano no prohíbe este tipo de archivos (comportamiento se define).

Esta advertencia también podría ayudar para indicar que un archivo que podría haber sido truncada de alguna manera.Es cierto que el compilador probablemente va a tirar un error del compilador de todos modos - especialmente si es en el medio de una función - o tal vez un error del vinculador, pero estos podrían ser más críptico, y no están garantizados a ocurrir.

Por supuesto, esta advertencia también no está garantizada si el archivo se trunca inmediatamente después de un salto de línea, pero todavía podía coger algunos casos que otros errores pueden perder, y le da un fuerte indicio del problema.

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

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

A pesar de que, además de eso, usted debe utilizar #include <iostream> en lugar de <iostream.h>.A continuación, poner en un using std::cout; después de ella.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top