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?
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.
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.