¿Por qué todos los archivos C escritos por mi profesor comienzan con un solo # en la primera línea?

431

Estoy revisando algunas notas del curso C, y cada archivo fuente del programa C comienza con un solo #en la primera línea del programa.

Luego hay líneas en blanco, y luego otras cosas seguidas de la mainfunción.

¿Cuál es el motivo de la #?

(Está fuera de plazo ahora y realmente no puedo preguntarle al muchacho).

Aquí hay un ejemplo:

#

#include <stdio.h>
int main() {
   printf("Hello, World!");
   return 0;
}
El hombre principal
fuente
3
Pongo el primer ejemplo en las notas del curso. Literalmente está el #, luego una línea en blanco, luego el programa.
The Main Man
30
El objetivo principal del vacío #es la ofuscación. Si desea confundir a todos, puede comenzar, por ejemplo, todos sus archivos fuente con la línea #//#BEGIN#\\#(que no hace absolutamente nada).
Lundin
3
@Bathsheba Probablemente sea una de estas personas cl.cam.ac.uk/people/academic.html
TylerH
77
@Bathsheba Las marcas de tiempo en ese último muestran que usted dio una respuesta razonablemente detallada solo un minuto después de que se hizo la pregunta, completa con una cita relevante del estándar de referencia C99. Definitivamente eres una persona de conspiración. Posiblemente en los Illuminati. Sin embargo, ¿cómo terminaron siendo tan populares ambas preguntas?
Nat

Respuestas:

614

Wow, este requisito se remonta a la década de 1970.

En los primeros días de la C previamente estandarizada, si quería invocar el preprocesador , tenía que escribir un #como lo primero en la primera línea de un archivo fuente. Escribir solo una #en la parte superior del archivo ofrece flexibilidad en la ubicación de las otras directivas de preprocesador.

De un borrador original en C del gran Dennis Ritchie :

12. Líneas de control del compilador

[...] Para que se invoque [el] preprocesador, es necesario que la primera línea del programa comience con #. Como las líneas nulas son ignoradas por el preprocesador, esta línea no necesita contener otra información.

Ese documento es una gran lectura (y me permitió saltar sobre esta pregunta como un gato loco).

Sospecho que es el profesor simplemente sentimental: no se ha requerido ciertamente desde ANSI C.

Betsabé
fuente
22
Según tengo entendido, el requisito no es que el primer carácter debe ser un #en una línea por sí mismo, solo que comienza con un #, así que ¿por qué no ir directamente por un #include? ¿O lo estoy entendiendo mal?
Federico klez Culloca
14
@Bathsheba " Para hacer que se invoque este preprocesador, es necesario que la primera línea del programa comience con #. Dado que el preprocesador ignora las líneas nulas, esta línea no necesita contener otra información " . <- entonces ya puede contener una directiva de preprocesador, pero no es necesario ...
55
No era un requisito cuando comencé a programar en C (1980). ANSI C no fue estandarizado hasta 1989.
pojo-guy
29
@ federico-klez-culloca Si se convierte en una inclusión, el archivo puede terminar sin un # principal porque en el futuro alguien eliminará una inclusión innecesaria sin ser consciente de los efectos secundarios de # principal.
Fadeway
44
@Casanova - No. Hacer eso y aceptar esa respuesta infringe las reglas del sitio. Preguntar y responder bajo diferentes cuentas va en contra del espíritu de las reglas del sitio, incluso sin votación mutua, si entiendes lo que digo. No tiene nada de malo responder a su propia pregunta y aceptarla con la misma cuenta; lo he hecho en el pasado.
Betsabé
1

No hace nada

A partir del estándar ISO de C / C ++:

Una directiva de preprocesamiento del formulario

# new-line

no tiene efecto.

Entonces, en los compiladores de hoy, ese hash vacío no hace nada (como, new-line ;no tiene funcionalidad).


PD : En C# new-line preestandarizado , tenía un papel importante, se utilizó para invocar el preprocesador C (como lo señaló @Bathsheba). Entonces, el código aquí fue escrito dentro de ese período de tiempo o vino por hábito.

Minhas Kamal
fuente
-5

Necesita saber sobre el proceso de compilación de C. Porque eso es "debe saber" cómo el código fuente se convierte en código binario ejecutable (archivo).

Desde el proceso de compilación, el código fuente C tiene que cruzar la sección del preprocesador. Pero, ¿cómo decirle al compilador que preprocese el código? ... Que el símbolo # de tiempo se introdujo en el indicador de preproceso al compilador.

Por ejemplo #define PI 3.141 está en el código fuente. Luego se cambiará después de la sesión de preprocesamiento. Significa que todo el PI se cambiará a 3.141.

Esto es como #include <stdio.h> , las funciones de E / S estándar se agregarán a su código fuente.

Si tiene una máquina Linux, compile como gcc -save-temps source_code.c. Y ver las salidas del compilador.

GOBI
fuente