texto son sirve signos que puntuación puntuacion puntos punto programacion poner para los ejemplos cuáles cuando comas coma c c-preprocessor

son - ¿Por qué#define no requiere un punto y coma?



signos de puntuación (7)

Ambas constantes? No.

El primer método no produce una constante en el lenguaje C. Las variables constantes no se califican como constantes en C. Su primer método funciona solo porque los compiladores de C99 pasados admiten matrices de longitud variable (VLA). Su buffer es un VLA en el primer caso específicamente porque MAX_STRING no es una constante. Intente declarar la misma matriz en el alcance del archivo y obtendrá un error, ya que los VLA no están permitidos en el alcance del archivo.

El segundo método puede usarse para asignar nombres a valores constantes en C, pero debe hacerlo correctamente. El ; en la definición de macro no debería estar allí. Las macros funcionan mediante la sustitución textual y no desea sustituir ese extra ; en su declaración de matriz. La forma correcta de definir esa macro sería

#define MAX_STRING 256

En lenguaje C, cuando se trata de definir las constantes nombradas adecuadas, básicamente está limitado a macros y enumeraciones. No intentes usar const "constantes", a menos que realmente sepas que funcionarán para tus propósitos.

Estaba escribiendo un código de prueba en C. Por error había insertado un ; después de un #define , que me dio errores. ¿Por qué no se requiere un punto y coma para #define s?

Más específicamente :

Método 1: obras

const int MAX_STRING = 256; int main(void) { char buffer[MAX_STRING]; }

Método 2: No funciona - error de compilación.

#define MAX_STRING 256; int main(void) { char buffer[MAX_STRING]; }

¿Cuál es la razón del comportamiento diferente de esos códigos? ¿Esas dos MAX_STRINGs no son constantes?


Esta directiva preprocesador:

#define MAX_STRING 256;

le dice al preprocesador que reemplace todos los MAX_STRING s con 256; - Y con el punto y coma . Las declaraciones del preprocesador no necesitan un punto y coma al final. Si pones uno, el preprocesador realmente piensa que lo dices con un punto y coma.

Si está confundido con #define s para constantes, probablemente sería más fácil comprender const int .

Si desea obtener más información sobre cómo utilizar correctamente estas directivas de preprocesador, intente consultar este sitio web.


La segunda versión no define una constante en lo que respecta al idioma, solo una regla de sustitución para un bloque de texto. Una vez que el preprocesador ha hecho su trabajo, el compilador ve

char buffer [256;];

lo cual no es sintácticamente válido.

La moraleja de la historia: prefiero la const int MAX_STRING = 256; así como eso te ayuda a ti, al compilador y al depurador.


Porque así se decidió la sintaxis de las directivas de precompilador .

Sólo las declaraciones terminan con un ; en c / c ++, #define es una directiva de preprocesador y no una declaración .


#define es una directiva de preprocesador , no una declaración o declaración tal como se define en la gramática C (se requiere que ambas terminen con un punto y coma). Las reglas para la sintaxis de cada uno son diferentes.


define es una directiva de preprocesador, y es un reemplazo simple, no es una declaración.

Por cierto, como reemplazo puede contener algunos ; como parte de esto

// Ugly as hell, but valid #define END_STATEMENT ; int a = 1 END_STATEMENT // preprocessed to -> int a = 1;


#define MAX_STRING 256;

medio:

siempre que encuentre MAX_STRING al preprocesar, sustitúyalo por 256; . En tu caso hará el método 2:

#include <stdio.h> #include <stdlib.h> #define MAX_STRING 256; int main(void) { char buffer [256;]; }

que no es sintaxis válida. Reemplazar

#define MAX_STRING 256;

con

#define MAX_STRING 256

La diferencia entre sus dos códigos es que en el primer método declara una constante igual a 256 pero en el segundo código define MAX_STRING para representar 256; en su archivo fuente

La directiva #define se usa para definir valores o macros que usa el preprocesador para manipular el código fuente del programa antes de compilarlo. Debido a que las definiciones del preprocesador se sustituyen antes de que el compilador actúe sobre el código fuente, cualquier error introducido por #define es difícil de rastrear.

La sintaxis es:

#define CONST_NAME VALUE

si hay un Al final, se considera como parte de VALUE .

para entender cómo funciona exactamente #define s, intente definir:

#define FOREVER for(;;) ... FOREVER { /perform something forever. }

Interesante comentario de John Hascall :

La mayoría de los compiladores le darán una forma de ver la salida después de la fase de preprocesador, esto puede ayudar con la depuración de problemas como este.

En gcc se puede hacer con la bandera -E .