¿Por qué #define INVALID_VALUE -999; da un error de syntax cuando se utiliza?

Estoy tratando de comparar con una constante definida en C, y he simplificado mi progtwig a lo siguiente:

#include "stdio.h" #include "stdlib.h" #define INVALID_VALUE -999; int main(void) { int test=0; if(test==INVALID_VALUE) //The error line.. return INVALID_VALUE; return 0; } 

Y cuando uso gcc para comstackr, emite el error ” error: expected ')' before ';' token error: expected ')' before ';' token “.

¿Hay alguna razón para que esto no se pueda hacer?

Elimine el punto y coma de su definición INVALID_VALUE.

Las macros se reemplazan de forma léxica (carácter por carácter) sin comprender la syntax que las rodea. Su macro INVALID_VALUE se establece en -999; , entonces tu línea if expande la macro a:

 if (test==-999;) 

que no es válida la syntax de C.

Necesitas quitar el ; en #define INVALID_VALUE -999; . Ver el código fijo .

Podría haber trabajado para llegar a esta conclusión al comprender qué expected ')' before ';' token mensaje de error expected ')' before ';' token expected ')' before ';' token estaba diciendo. Te está diciendo que esperaba encontrar a ) antes del ; token, pero al inspeccionar la línea solo no ves un ; . ¿Entonces tal vez hay uno en la definición de INVALID_VALUE ? Busque en #define INVALID_VALUE -999; y ahí está! ¿Crees que debería estar allí, pero no está seguro? Así que intentemos eliminarlo y ver si funciona. ¡Éxito!

Esta página explica y explica por qué no debe concluir un #define con un punto y coma, incluso si es necesario en el uso de la macro. Es bueno aprender lo más posible de tu error para que no vuelvas a hacerlo. Citar:

Las definiciones de macros, independientemente de si se expanden a una o varias declaraciones no deben concluir con un punto y coma. Si es necesario, el punto y coma debe incluirse después de la expansión de la macro. La inserción inadvertida de un punto y coma al final de la definición de macro puede cambiar inesperadamente el flujo de control del progtwig.

Otra forma de evitar este problema es preferir las funciones en línea o estáticas a las macros similares a funciones.

En general, el progtwigdor debe asegurarse de que no haya punto y coma al final de la definición de una macro. La responsabilidad de tener un punto y coma cuando sea necesario durante el uso de dicha macro debe delegarse a la persona que invoca la macro.

El lenguaje de macros de preprocesador de C es distinto de C


El ; en la macro definición debe eliminarse.

Este es un error comprensible. Si C se diseñara hoy, el lenguaje macro podría estar más integrado con el rest de C.

Pero en las máquinas de 16 bits a principios de la década de 1970 cuando se inventó C, no era aconsejable escribir un progtwig demasiado complicado. Terminaría siendo inútil ya que no quedaría memoria para ejecutar el gran progtwig de la obra maestra, e incluso los progtwigs simples se ejecutaron lentamente.

Así que C se dividió en un preprocesador de macros bastante simple que, originalmente, era un progtwig completamente separado y el comstackdor era adecuado. El progtwig del preprocesador no intentó analizar C más allá de comprender el modelo de análisis léxico.

Cuando las máquinas de 32 bits tomaron el control, el preprocesador se integró típicamente en el analizador, pero naturalmente el lenguaje necesitaba seguir siendo el mismo.

El punto y coma al final de

 #define INVALID_VALUE -999; 

Clásico.

No necesitas un punto y coma después de definir algo. #define es en realidad una macro, y hará una expansión en línea en la comstackción.

Así,

 #define IDENTIFIER 10; int j = IDENTIFIER; 

se expandirá como:

 int j = 10;; 

Cambiar macro

desde:

 #define INVALID_VALUE -999; 

a

 #define INVALID_VALUE -999 

Adiós