Pourquoi #define INVALID_VALUE -999; donner une erreur de syntaxe quand utilisé?

J’essaie de comparer des constantes définies en C et j’ai simplifié mon programme comme suit:

#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; } 

Et quand j’utilise gcc pour comstackr, cela donne l’erreur ” error: expected ')' before ';' token error: expected ')' before ';' token “.

Y a-t-il une raison pour que cela ne puisse pas être fait?

Supprimez le point-virgule de votre définition INVALID_VALUE.

Les macros sont remplacées lexicalement (caractère par caractère) sans compréhension de la syntaxe qui les entoure. Votre macro INVALID_VALUE est définie sur -999; Ainsi, votre ligne if étend la macro à:

 if (test==-999;) 

qui est la syntaxe C invalide.

Vous devez enlever le ; dans #define INVALID_VALUE -999; . Voir le code fixe .

Vous auriez pu travailler à cette conclusion en comprenant ce que le message d’erreur expected ')' before ';' token expected ')' before ';' token vous le disait. Cela vous dit qu’il s’attend à trouver a ) avant le ; jeton, mais en inspectant la ligne seule, vous ne voyez pas un ; . Alors peut-être qu’il y en a un dans la définition de INVALID_VALUE ? Regardez à #define INVALID_VALUE -999; et le voilà! Vous pensez que cela devrait être là, mais pas sûr? Essayons donc de l’enlever et de voir si cela fonctionne. Succès!

Cette page explique pourquoi vous ne devriez pas conclure un #define avec un point-virgule, même si cela est nécessaire pour l’utilisation de la macro. Il est bon de tirer le maximum de leçons de votre erreur pour ne pas recommencer. Citation:

Les définitions de macro, qu’elles soient étendues à une ou plusieurs déclarations, ne doivent pas se terminer par un point-virgule. Si nécessaire, le point-virgule doit être inclus après le développement de la macro. L’insertion par inadvertance d’un point-virgule à la fin de la définition de macro peut modifier de manière inattendue le stream de contrôle du programme.

Une autre façon d’éviter ce problème consiste à préférer les fonctions en ligne ou statiques aux macros de type fonction.

En général, le programmeur doit s’assurer qu’il n’y a pas de point-virgule à la fin d’une définition de macro. La responsabilité de disposer d’un point-virgule, le cas échéant, lors de l’utilisation d’une telle macro doit être déléguée à la personne qui l’invoque.

Le langage macro du préprocesseur C est distinct de C


Le ; dans la macro, la définition doit être supprimée.

C’est une erreur compréhensible. Si C était conçu aujourd’hui, le langage macro pourrait être plus intégré au rest de C.

Mais sur les machines 16 bits du début des années 1970, lorsque C a été inventé, il n’était pas sage d’écrire un programme trop compliqué. Cela finirait par devenir inutile, car il ne restrait plus de mémoire pour exécuter le gros programme principal, et même des programmes simples s’exécuteraient lentement.

Donc C a été scindé en un préprocesseur de macros assez simple qui était, à l’origine, un programme complètement séparé et le compilateur proprement dit. Le programme de préprocesseur n’a pas tenté d’parsingr C au-delà de la compréhension du modèle d’parsing lexicale.

Lorsque les machines 32 bits ont pris le relais, le préprocesseur était généralement intégré à l’parsingur, mais le langage devait naturellement restr le même.

Le sharepointux-points à la fin de

 #define INVALID_VALUE -999; 

Classique.

Vous n’avez pas besoin d’un point-virgule après avoir défini quelque chose. #define est en fait une macro, et il fera une expansion en ligne lors de la compilation.

Ainsi,

 #define IDENTIFIER 10; int j = IDENTIFIER; 

se développera comme:

 int j = 10;; 

Changer de macro

de:

 #define INVALID_VALUE -999; 

à

 #define INVALID_VALUE -999 

Au revoir