Header Ads

Erreur de compilation "unqualified-id before ‘double’"

Introduction
Comme précisé dans l'article "Erreur de compilation ‘boolean’ does not name a type", le fait de créer un projet Arduino (fichier ".pde") incluant un fichier ".h" qui lui même inclus "WConstants.h" peut être devenir la source d'une autre erreur de compilation dans le fichier principal (le fichier ".pde").
C'est ainsi que j'ai rencontré l'erreur suivante à la compilation de mon projet:
In file included from /usr/share/arduino/hardware/arduino/cores/arduino/WProgram.h:6,
                 from ArduinoCar_Test_BtnInterface.cpp:18:
/usr/lib/gcc/avr/4.3.5/../../../avr/include/math.h:426: erreur: expected unqualified-id before ‘double’
/usr/lib/gcc/avr/4.3.5/../../../avr/include/math.h:426: erreur: expected `)' before ‘double’
/usr/lib/gcc/avr/4.3.5/../../../avr/include/math.h:426: erreur: expected `)' before ‘double’

Cause
Il semblerait que le fait d'avoir inclus WConstants.h dans le processus de compilation mette en place une nouvelle définition de la fonction round.
C'est cette nouvelle définition qui rentre en conflit avec celle disponible dans math.h (à la ligne 426).
Le nombre de paramètre n'étant identique, le compilateur n'arrive pas a résoudre l'appel de fonction.

Solution
En faisant quelques recherches sur le net, j'ai appris qu'il suffisait d'ajouter l'instruction
#undef round 
après l'include causant l'erreur de compilation (merci au forum AdaFruit), dans mon cas, il s'agit de l'include de "ButtonTools.h".

Le fichier principal de mon projet (fichier ".pde") ressemble donc à ceci:
// Inclusion de mon fichier "ButtonState.h" pour faciliter la capture des états des boutons.
// Provoque aussi l'erreur "expected unqualified-id before ‘double’" à cause de l'inclusion
//   de "WConstants.h" nécessaire à la définition dy type "boolean".
#include "ButtonTools.h"

// Evite l'erreur "expected unqualified-id before ‘double’"
// voir article http://forums.adafruit.com/viewtopic.php?f=25&t=19511 on AdaFruit Forum
#undef round 

// ==========================================================
//     MAIN PROGRAM
// ==========================================================

int pinStart = 7; // Start/Stop - Brun
int pinDebug = 8; // Debug Switch - Orange
...




Note
Au détour de mes lectures, certaines propositions avançaient une liste plus complète de #undef comme:
#undef int
#undef abs
#undef double
#undef float
#undef round
J'ai néanmoins constaté que le seul #undef round était suffisant.