¿Por qué no hay punto y coma después de las directivas de preprocesador?

Si escribo

#include ; 

No hay error, pero aparece una advertencia durante la comstackción.

pari.c: 1: 18: advertencia: tokens adicionales al final de la directiva #include

Cual es la razon ?

La razón es que las directivas de preprocesador no usan punto y coma. Esto se debe a que utilizan un salto de línea para delimitar las declaraciones. Esto significa que no puede tener varias directivas por línea:

 #define ABC #define DEF // illegal 

Pero puede tener uno en varias líneas terminando cada línea (excepto la última) con un \ (o /, lo olvido).

Debido a que las directivas de preprocesador son líneas incluidas en el código de nuestros progtwigs, no son declaraciones de progtwigs sino directivas para el preprocesador.

Estas directivas de preprocesador se extienden solo en una sola línea de código. Tan pronto como se encuentra un carácter de nueva línea, se considera que la directiva del preprocesador finaliza. Es por eso que no se espera un punto y coma (;) al final de una directiva de preprocesador.

Las directivas de preprocesador son un lenguaje diferente a C y tienen una gramática mucho más simple, porque originalmente fueron “analizadas”, si se puede llamar así, por un progtwig diferente llamado cpp antes de que el comstackdor de C viera el archivo. La gente podría usar eso para preprocesar incluso archivos que no sean de C para incluir partes condicionales de archivos de configuración y similares.

Existe un progtwig de Linux llamado “unifdef” que aún puede usar para eliminar algunas de las partes condicionales de un progtwig si sabe que nunca serán ciertas. Por ejemplo, si tiene algún código para admitir comstackdores que no sean ANSI rodeados por #ifdef ANSI/#else/#end o simplemente #ifndef ANSI/#end , y sabe que nunca más tendrá que admitir que no sea ANSI , puede eliminar el código muerto ejecutándolo a través de unifdef -DANSI .

Porque son innecesarios. Las directivas de preprocesador solo existen en una línea, a menos que use explícitamente un carácter de continuación de línea (por ejemplo, una macro grande).

y si utiliza #define MACRO(para) fun(para); Podría ser INCORRECTO poner un semicolon detrás de él.

 if (cond) MACRO (par1); else MACRO (par2); 

conduce a un error sintáctico

Durante la comstackción, su código es procesado por dos progtwigs separados, el preprocesador y el comstackdor. El preprocesador se ejecuta primero.

Su código se compone en realidad de dos idiomas, uno superpuesto sobre otro. El preprocesador trata con un idioma, que son todas las directivas que comienzan con “#” (y las implicaciones de estas directivas). Procesa las directivas “#include”, “#define” y otras, y deja el rest del código intacto (bueno, excepto como efecto secundario de las directivas del preprocesador, como las sustituciones de macros, etc.).

Luego, el comstackdor aparece y procesa la salida generada por el preprocesador. Trata con el lenguaje “C”, y prácticamente ignora las directivas del preprocesador.

La respuesta a su pregunta es que “#include” es una parte del lenguaje procesado por el preprocesador, y en este idioma “;” no son obligatorios, y son, de hecho, “fichas adicionales”.