¿Cuál es la razón 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 de origen / encabezado?
c++
compiler-construction
warnings
c-preprocessor
Brian Tompsett - 汤 莱恩
fuente
fuente
cat
un archivo y no tiene una nueva línea final ya que el nuevo indicador de shell aparecerá después de la última línea del archivo (es decir, no en la columna 0)Why should I have an empty line at the end of a source/header file
- Si un archivo de texto contiene,one\ntwo\nthree\n
entonces contiene tres líneas, ninguna de las cuales está vacía. Si un archivo de texto contiene,one\ntwo\nthree
entonces no es un archivo de texto, en el mismo sentido que una oración sin un punto final al final no es una oración.Respuestas:
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#include <foo.h>
después del contenido del archivo. Entonces, si incluye un archivo sin nueva línea al final del analizador, se verá como si la última línea de estuvierafoo.h
en la misma línea que la primerafoo.cpp
. ¿Qué pasaría si la última línea de foo.h fuera un comentario sin una nueva línea? Ahorafoo.cpp
se comenta la primera línea de . Estos son solo algunos 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 C ++ (C ++ 11) se ha modificado para que esta advertencia ya no se emita si se usa C ++ y un compilador conforme a C ++ 11.
Desde el estándar C ++ 11 a través de la publicación de James:
fuente
El requisito de que cada archivo de origen finalice con una nueva línea sin escape se eliminó en C ++ 11. La especificación ahora dice:
Un compilador conforme ya no debería emitir esta advertencia (al menos no cuando compila en modo C ++ 11, si el compilador tiene modos para diferentes revisiones de la especificación del lenguaje).
fuente
El estándar C ++ 03 [2.1.1.2] declara:
fuente
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 .
fuente
No se refiere a una línea en blanco, es si la última línea (que puede tener contenido) está terminada 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 una, 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.
fuente
#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 lo jaló se fusionará con la siguiente línea.fuente
Estoy usando c-free IDE versión 5.0, en mi programa, ya sea del 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. luego ejecute el mismo programa, se ejecutará sin error.
fuente
C / C ++ no específico, sino un dialecto C: cuando se usa la
GL_ARB_shading_language_include
extensión, el compilador glsl en OS X le advierte que NO le falta una nueva línea. Por lo tanto se puede escribir unMyHeader.h
archivo con un guardia de cabecera, que termina con#endif // __MY_HEADER_H__
y usted va a perder la línea después del#include "MyHeader.h"
seguro.fuente
Porque el comportamiento difiere entre las versiones de C / C ++ si el archivo no termina con nueva línea. Especialmente desagradable son las versiones anteriores de C ++, fx en C ++ 03 que el estándar dice (fases de traducción):
El comportamiento indefinido es malo: un compilador conforme estándar podría hacer más o menos lo que quiere aquí (insertar código malicioso o lo que sea), claramente un motivo de 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, lo que prohíbe directamente dichos archivos (el comportamiento se define luego).
fuente
#include
directiva , y algunos programadores que se dirigen a dichos compiladores pueden haber explotado dicho comportamiento. Hacer que el Estándar deje tales cosas sin definir permitiría que los programas que exploten tales peculiaridades estén bien definidos en las plataformas que especifican dicho comportamiento. Tener el mandato estándar de un comportamiento rompería tales programas.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 del compilador de todos modos, especialmente si está en el medio de una función, o tal vez un error de enlace, 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 podrían fallar otros errores y da una pista más clara del problema.
fuente
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 en
#include <iostream>
lugar de<iostream.h>
. Luego pon unusing std::cout;
después.fuente