web-dev-qa-db-fra.com

Que signifie l'erreur de compilation "Opérateur binaire manquant avant jeton"?

J'ai récemment eu l'erreur suivante lors de la compilation avec gcc:

erreur: opérateur binaire manquant avant le jeton "("

Les recherches Web et SO ont donné plusieurs exemples spécifiques de cette erreur, avec des modifications de code spécifiques pour les corriger. Mais je n'ai trouvé aucune description générale de la condition qui a provoqué cette erreur.

Quand et pourquoi gcc émet-il cette erreur?

15
AShelly

Ce n'est pas une erreur du compilateur, c'est une erreur du préprocesseur. Cela semble se produire lorsque le préprocesseur rencontre une syntaxe non valide lors de la tentative d'évaluation d'une expression dans une directive #if ou #Elif.

Une cause fréquente est l'opérateur sizeof dans une directive #if:

Par exemple:

  #define NBITS (sizeof(TYPE)*8)
  //later
  #if (NBITS>16)    //ERROR

Il s'agit d'une erreur car sizeof est évalué par le compilateur, et non par le préprocesseur

Les transtypages ne constituent pas non plus une syntaxe de préprocesseur valide:

  #define ALLBITS ((unsigned int) -1)
  //later
  #if (ALLBITS>0xFFFF)    //ERROR

Les les règles pour ce qui peut être dans une expression valide sont ici .

Notez également que #if évalue une macro non définie à 0, à moins qu’elle ne prenne des arguments, auquel cas vous obtenez également cette erreur :

Donc, si THIS n'est pas défini:

#if THIS == 0  //valid, true

#if THIS > 0 //valid, false

#if THIS() == 0  //invalid. ERROR

Les typos dans votre instruction #if peuvent également provoquer ce message.

33
AShelly

Si vous êtes sous Linux, assurez-vous de ne pas avoir d'en-tête nommé features.h dans vos fichiers de projet . J'en avais un avec ce nom, ce qui a eu pour résultat:

/usr/include/x86_64-linux-gnu/bits/huge_val.h:25: erreur: pointeur de fonction attendu

ou

/usr/include/bits/huge_val.h:26:18: erreur: opérateur binaire manquant avant le jeton "("

En effet, certains en-têtes système tels que huge_val.h utilisent des macros telles que __GNUC_PREREQ définies par /usr/include/features.h (pour en savoir plus sur cet en-tête dans cette SO question ).

Dans mon cas, j'ai constaté cette erreur lorsque j'ai commencé à utiliser l'option -I de gcc, qui a soudainement forcé gcc à sélectionner mon répertoire d'inclusion de projet avant les répertoires d'inclusion système par défaut.

0
Gabriel Devillers