Curiosidades – Warning: no new line at end of file

Quizá la gran mayoría de personas que hayan programado alguna vez en C/C++ hayan encontrado este curioso warning. ¿Por qué hace falta un salto de línea al final de un fichero?

Aunque parezca un warning inofensivo realmente tiene sentido. Si miramos el standard de C, en el punto 5.1.1.2 encontramos entre otras cosas.

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 anysuch splicing takes place.

La explicación de porqué hay que poner un salto de línea al final de un fichero se basa en el funcionamiento del compilador. Suponiendo un caso habitual de programa en C/C++, hacen falta dos ficheros para compilar el programa. Un fichero .h con las firmas de los métodos, las definición de las clases, etc. Y un fichero .c/.cc/.cpp con el código correspondiente. Cuando el compilador se pone a procesar el fichero .c, entre otras cosas sustituye todos los #include por el contenido del correspondiente .h. A modo de ejemplo, podemos pensar en dos ficheros:

Fichero example.h

#define EXAMPLE 1<sin salto de línea>

Fichero example.c

#include "example.h"
int y; ...

Si ahora pensamos en lo que verá el compilador

#define EXAMPLE 1int y; ...

Lo que sí que es claramente un error.

6 comments so far

  1. cthulhu on

    Ya era hora de que alguien buscase un por qué a este enigma.

    Yo también planteo otro:

    ¿Por qué el el gcc no permite compilar archivos cuya fecha de creación es posterior a la actual?

    Otro enigma para ser resuelto.

  2. Diego on

    Eso es lo que pasa cuando tienes un compilador que necesita un preprocesador con «includes». Yo prefiero los compiladores más modernos, sin preprocesador y con importaciones de módulos reales, y no a base de incluir archivos dentro de otros.

  3. Ancient on

    Somehow i missed the point. Probably lost in translation 🙂 Anyway … nice blog to visit.

    cheers, Ancient!!

  4. Pedro on

    Excelente

  5. Pedro on

    excelete

  6. Henrik on

    Pero por que aun despues de añadir una linea en blanco sigue mostrando el error, acaso ¿sera que la linea no falta en el archivo.c, sino en algún archivo header del que hace uso?


Deja un comentario