define c++ compiler-construction warnings c-preprocessor

c++ - define - Advertencia de compilación "No hay nueva línea al final del archivo"



#define c++ (11)

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

no C / C ++ específico sino un dialecto C: cuando se utiliza la extensión GL_ARB_shading_language_include, el compilador glsl en OS X no le advierte sobre una nueva línea faltante. Así que puedes escribir un archivo MyHeader.h con un resguardo de encabezado que finaliza con #endif // __MY_HEADER_H__ y perderás la línea después del #include "MyHeader.h" seguro.

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

Sin nueva línea al final del archivo

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


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 precedido inmediatamente por un carácter de barra invertida antes de que se produzca dicho empalme, el comportamiento no está definido.


El requisito de que cada archivo fuente 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 termine en un carácter de nueva línea, o que termine en un carácter de nueva línea inmediatamente precedido por una barra invertida antes de que se produzca dicho empalme, se procesará como si se tratara de un nuevo el carácter de línea se anexó al archivo (C ++ 11 §2.2 / 1).

Un compilador conforme ya no debería emitir esta advertencia (al menos no al compilar en modo C ++ 11, si el compilador tiene modos para diferentes revisiones de la especificación del lenguaje).


Eso no es un error Es solo 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 estar usando #include <iostream> lugar de <iostream.h> . Luego ingrese un using std::cout; después de.


Esta advertencia también podría ayudar a indicar que un archivo podría haberse truncado de alguna manera. Es cierto que el compilador probablemente arrojará un error de compilación de todos modos, especialmente si está en el medio de una función, o quizás un error del 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 aún podría detectar algunos casos que otros errores podrían perderse, y da una pista más fuerte para el problema.


Estoy usando c-free IDE versión 5.0, en mi programa de lenguaje ''c ++'' o ''c'' estaba teniendo el mismo problema. Justo 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 -line no. se incrementará en 1. then ejecutar el mismo programa, se ejecutará sin error.


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 no está definido" (parafraseado).

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


No se refiere a una línea en blanco, sino a que la última línea (que puede tener contenido) finalice 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.


Piense en algunos de los problemas que pueden ocurrir si no hay línea nueva. De acuerdo con el estándar ANSI, el #include de un archivo al principio inserta el archivo exactamente como está en la parte frontal 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 línea nueva al final del analizador, se verá como si la última línea de foo.h en la misma línea que la primera línea de foo.cpp . ¿Y si la última línea de foo.h fuera 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.

Editar : solo quería apuntar a las partes interesadas a la respuesta de James a continuación. Mientras que la respuesta anterior sigue siendo correcta para C, se ha cambiado el nuevo estándar de C ++ (C ++ 11) para que ya no se emita esta advertencia si se usa C ++ y un compilador que cumpla con C ++ 11.

Desde el estándar C ++ 11 a través de la publicación de James:

Un archivo fuente que no esté vacío y que no termine en un carácter de nueva línea, o que termine en un carácter de nueva línea inmediatamente precedido por una barra invertida antes de que se produzca dicho empalme, se procesará como si se tratara de un nuevo el carácter de línea se anexó al archivo (C ++ 11 §2.2 / 1).


Porque el comportamiento difiere entre las versiones de C / C ++ si el archivo no finaliza con la nueva línea. Especialmente desagradable es C ++ - versiones más antiguas, fx en C ++ 03 dice el estándar (fases de traducción):

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 diagonal inversa, el comportamiento no está definido.

El comportamiento indefinido es malo: un compilador estándar puede hacer más o menos lo que quiere aquí (insertar código malicous o lo que sea) - claramente una razón para advertir.

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 de C ++ 03 es peor que C99, que prohíbe abiertamente dichos archivos (se define el comportamiento).


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