2010-04-30 9 views
1

Je suis nouveau à la programmation en C. J'ai pensé quand vous tapez quelque chose comme #define Const 5000 que le compilateur remplace juste chaque instance de Const avec 5000 au moment de la compilation. Est-ce faux? J'essaye de le faire dans mon code et j'obtiens une erreur de syntaxe. Pourquoi je ne peux pas faire ça?Pouvez-vous utiliser des valeurs # définies dans des instructions if (dans des programmes C)?

#define STEPS_PER_REV 12345 

... in some function 
if(CurrentPosition >= STEPS_PER_REV) 
{ 
    // do some stuff here 
} 

Le compilateur se plaint de l'instruction if avec une erreur de syntaxe qui ne me donne aucun détail.

+2

Quelle est l'erreur? – nc3b

+0

sont-ils dans le même fichier? – Anycorn

+0

L'erreur indique "erreur de syntaxe: token -> '' ; colonne 31 "et oui ils sont dans le même fichier. Ce qui est étrange, c'est que je peux l'utiliser dans une instruction d'assignation CURRENT_POSITION = STEPS_PER_REV mais pas dans les instructions IF – PICyourBrain

Répondre

12

les personnes dans les commentaires ont raison. Vous avez presque certainement un point-virgule à la fin de votre #define. Cela signifie que votre mission devient:

CURRENT_POSITION = 12345;; 

(en supposant que vous avez un point-virgule à la fin de la ligne ...)

mais votre cas devient:

if(CurrentPosition >= 12345;) 

qui est bien sûr invalide. Rappelez-vous que #defines ne sont PAS un code C. Ils n'ont pas besoin de points-virgules.

+0

Vous avez raison, c'était le problème! – PICyourBrain

2

Votre fragment de code est correct. #define est littéralement une substitution de chaîne (avec un peu plus d'intelligence).

Vous pouvez vérifier ce que fait le préprocesseur dans gcc en utilisant l'option -E, qui affichera le code après l'exécution du pré-processeur.

0

Vous avez raison en ce que le préprocesseur C va simplement remplacer STEPS_PER_REV par 12345. Donc, votre instruction if semble correcte, basée sur le code que vous avez fourni.

Pour aller au fond des choses, pourriez-vous s'il vous plaît poster votre code et le contenu actuel du message d'erreur.

0

Vous avez raison lorsque vous dites que le compilateur remplace chaque instance par le contenu de la macro. Vérifiez le type de CurrentPosition, probablement l'erreur est là.

+0

Vous pourriez être sur quelque chose avec les types.CurrentPosition est un long non signé. – PICyourBrain

+0

Il devrait fonctionner avec un non signé longtemps. Je pense que vous devez poster un peu plus de code, sinon ce n'est pas simple de trouver l'erreur. –

0

Oui, mais cela devrait être un const, pas une macro. Vous obtenez probablement le mauvais type dans votre comparaison.

0

#define en c sont des macros, elles sont utilisées par le préprocesseur c pour les remplacer lorsqu'elles sont trouvées. Par exemple dans votre code source le

**#define MAX_VALUE 500** 

*if(reservations < **MAX_VALUE**)* 
{ 
    ...... 
} 

will be become into 

*if(reservations < **500**)* 
{ 
     ...... 
} 

après l'étape de prétraitement. Pour qu'ils puissent être utilisés dans des états booléens dans des phrases si.