2009-10-25 20 views

Respuesta

18

macros misma razón #define no lo hacen - que son para el preprocesador, que se expande cosas como incluye y define antes de que el compilador toma adecuada terminado.

+4

Una definición un poco más: el preprocesador se ejecuta ANTES de que el compilador se ejecute, y reemplaza el texto. Una instrucción #include se reemplaza por el contenido del archivo al que se hace referencia. Un #define se ingresa en una tabla de búsqueda, y luego cuando la definición se ve en el código, se reemplaza con el valor almacenado, etc., etc. De hecho, puede usar otro preprocesador en lugar del estándar, pero pocos la gente lo hace en el mundo real. –

+0

¿no es también el preprocesador que hace la continuación de la línea funky, como \ y la concatenación de literales rotos? – JustJeff

+0

@JustJeff: vea http://stackoverflow.com/questions/1476892/poster-with-the-8-phases-of-translation-in-the-c-language; la concatenación de literales de cadena se realiza en la fase de traducción 6 entre el preprocesamiento (fase 4) y el análisis semántico/compilación (fase 7), por lo que puede hacerlo en preprocesador o compilador; unir las líneas a lo largo de las barras inversas posteriores tiene lugar en la fase 2 antes de que el preprocesador funcione correctamente. – Christoph

10

Las líneas que comienzan con un # no son parte del lenguaje C en sí, son instrucciones para un preprocesador. Cuando se diseñó por primera vez, los puntos y comas no eran necesarios.

4

#include es un comando pre-procesamiento como #define. #include le dice al compilador que incluya el archivo especificado en su código fuente antes de que su código realmente se compile.

+1

He solucionado el formateo por usted; cuando escribe una respuesta, puede ver la vista previa debajo del cuadro de texto para ver cómo se verá. # es un char de formateo, por lo que debe protegerlo de una forma u otra. –

+0

gracias por su ayuda. – sdp07

7

"... mientras que otras declaraciones lo hacen".

En primer lugar, las directivas de preprocesador no son declaraciones . La declaración es una entidad que existe solo en el nivel sintáctico/semántico. Las directivas de preprocesador se procesan en etapas relativamente tempranas de la traducción, antes de que comience cualquier análisis de sintaxis, por lo que en esa etapa todavía no existe una "declaración". Y, por esta razón, no existe un fundamento significativo para exigir que se ponga fin a la directiva #include con un punto y coma. De hecho, las directivas de preprocesador ocupan por definición toda la línea, lo que significa que ya están terminadas por un carácter de nueva línea. Cualquier terminador adicional sería redundante.

En segundo lugar, no todas las "otras declaraciones" terminan con punto y coma. Una instrucción compuesta, por ejemplo, no contiene

i = 5; 

{ /* <- compound statement begins here... */ 
    i = 10; 
} /* <- ... and ends here. Note: no semicolon */ 

i = 15; 
Cuestiones relacionadas