2016-12-12 2 views
1

J'utilise PlatformIO pour compiler mon ESP8266 (ESP12e) avec le framework Arduino. À un certain point, j'obtiens des erreurs si j'utilise #include dans un certain ordre.Erreur ESP8266: la macro "min" a passé 3 arguments, mais prend seulement 2

Ci-dessous est simplifié mon code:

platformio.ini

[env:esp12e] 
platform = espressif8266 
board = esp12e 
framework = arduino 
upload_speed = 460800 

Teste.h

//#include <cstdlib> //<<--this 
#include <cstring> //<<-- and/or this causes error! 
#include <Arduino.h> 
#include <map> 

Teste.cpp

#include "Teste.h" 
void setup() {} 
void loop() {} 

Sortie

$ pio run 
Please wait while upgrading PlatformIO ... 
Updating atmelavr @ 1.3.1: [Up-to-date] 
Updating toolchain-atmelavr @ 1.40902.0: [Up-to-date] 
Updating framework-arduinoavr @ 1.10612.1: [Up-to-date] 
Updating espressif8266 @ 1.3.0:  [Up-to-date] 
Updating toolchain-xtensa @ 1.40802.0: [Up-to-date] 
Updating tool-esptool @ 1.409.0: [Up-to-date] 
Updating tool-mkspiffs @ 1.102.0: [Up-to-date] 
Updating tool-espotapy @ 1.0.0:  [Up-to-date] 
Updating framework-arduinoespressif8266 @ 1.20300.1: [Up-to-date] 
Updating sdk-esp8266 @ 1.10502.0: [Up-to-date] 
PlatformIO has been successfully upgraded to 3.2.1! 

[Sun Dec 11 23:02:55 2016] Processing esp12e (platform: espressif8266, lib_deps: PubSubClient, upload_speed: 460800, board: esp12e, framework: arduino) 
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 
Verbose mode can be enabled via `-v, --verbose` option 
Collected 24 compatible libraries 
Looking for dependencies... 
Library Dependency Graph 
|-- <PubSubClient> v2.6 
Compiling .pioenvs/esp12e/src/Teste.o 
Archiving .pioenvs/esp12e/libFrameworkArduinoVariant.a 
Indexing .pioenvs/esp12e/libFrameworkArduinoVariant.a 
Compiling .pioenvs/esp12e/FrameworkArduino/Esp.o 
In file included from /home/erico/.platformio/packages/toolchain-xtensa/xtensa-lx106-elf/include/c++/4.8.2/bits/stl_tree.h:61:0, 
from /home/erico/.platformio/packages/toolchain-xtensa/xtensa-lx106-elf/include/c++/4.8.2/map:60, 
from src/Teste.h:4, 
from src/Teste.cpp:1: 
/home/erico/.platformio/packages/toolchain-xtensa/xtensa-lx106-elf/include/c++/4.8.2/bits/stl_algobase.h:239:56: error: macro "min" passed 3 arguments, but takes just 2 
min(const _Tp& __a, const _Tp& __b, _Compare __comp) 
^ 
/home/erico/.platformio/packages/toolchain-xtensa/xtensa-lx106-elf/include/c++/4.8.2/bits/stl_algobase.h:260:56: error: macro "max" passed 3 arguments, but takes just 2 
max(const _Tp& __a, const _Tp& __b, _Compare __comp) 
^ 
Compiling .pioenvs/esp12e/FrameworkArduino/FS.o 
Compiling .pioenvs/esp12e/FrameworkArduino/HardwareSerial.o 
Compiling .pioenvs/esp12e/FrameworkArduino/IPAddress.o 
In file included from src/Teste.h:3:0, 
from src/Teste.cpp:1: 
/home/erico/.platformio/packages/toolchain-xtensa/xtensa-lx106-elf/include/c++/4.8.2/bits/stl_algobase.h:193:5: error: expected unqualified-id before 'const' 
min(const _Tp& __a, const _Tp& __b) 
^ 
/home/erico/.platformio/packages/toolchain-xtensa/xtensa-lx106-elf/include/c++/4.8.2/bits/stl_algobase.h:193:5: error: expected ')' before 'const' 
/home/erico/.platformio/packages/toolchain-xtensa/xtensa-lx106-elf/include/c++/4.8.2/bits/stl_algobase.h:193:5: error: expected ')' before 'const' 
/home/erico/.platformio/packages/toolchain-xtensa/xtensa-lx106-elf/include/c++/4.8.2/bits/stl_algobase.h:193:5: error: expected initializer before 'const' 
/home/erico/.platformio/packages/toolchain-xtensa/xtensa-lx106-elf/include/c++/4.8.2/bits/stl_algobase.h:216:5: error: expected unqualified-id before 'const' 
max(const _Tp& __a, const _Tp& __b) 
^ 
/home/erico/.platformio/packages/toolchain-xtensa/xtensa-lx106-elf/include/c++/4.8.2/bits/stl_algobase.h:216:5: error: expected ')' before 'const' 
/home/erico/.platformio/packages/toolchain-xtensa/xtensa-lx106-elf/include/c++/4.8.2/bits/stl_algobase.h:216:5: error: expected ')' before 'const' 
/home/erico/.platformio/packages/toolchain-xtensa/xtensa-lx106-elf/include/c++/4.8.2/bits/stl_algobase.h:216:5: error: expected initializer before 'const' 
In file included from /home/erico/.platformio/packages/toolchain-xtensa/xtensa-lx106-elf/include/c++/4.8.2/bits/stl_tree.h:61:0, 
from /home/erico/.platformio/packages/toolchain-xtensa/xtensa-lx106-elf/include/c++/4.8.2/map:60, 
from src/Teste.h:4, 
from src/Teste.cpp:1: 
/home/erico/.platformio/packages/toolchain-xtensa/xtensa-lx106-elf/include/c++/4.8.2/bits/stl_algobase.h:239:5: error: 'std::min' declared as an 'inline' variable 
min(const _Tp& __a, const _Tp& __b, _Compare __comp) 
^ 
/home/erico/.platformio/packages/toolchain-xtensa/xtensa-lx106-elf/include/c++/4.8.2/bits/stl_algobase.h:239:5: error: template declaration of 'const _Tp& std::min' 
/home/erico/.platformio/packages/toolchain-xtensa/xtensa-lx106-elf/include/c++/4.8.2/bits/stl_algobase.h:242:7: error: expected primary-expression before 'if' 
if (__comp(__b, __a)) 
^ 
/home/erico/.platformio/packages/toolchain-xtensa/xtensa-lx106-elf/include/c++/4.8.2/bits/stl_algobase.h:242:7: error: expected '}' before 'if' 
/home/erico/.platformio/packages/toolchain-xtensa/xtensa-lx106-elf/include/c++/4.8.2/bits/stl_algobase.h:244:7: error: expected unqualified-id before 'return' 
return __a; 
^ 
/home/erico/.platformio/packages/toolchain-xtensa/xtensa-lx106-elf/include/c++/4.8.2/bits/stl_algobase.h:260:5: error: 'max' declared as an 'inline' variable 
max(const _Tp& __a, const _Tp& __b, _Compare __comp) 
^ 
/home/erico/.platformio/packages/toolchain-xtensa/xtensa-lx106-elf/include/c++/4.8.2/bits/stl_algobase.h:260:5: error: template declaration of 'const _Tp& max' 
/home/erico/.platformio/packages/toolchain-xtensa/xtensa-lx106-elf/include/c++/4.8.2/bits/stl_algobase.h:263:7: error: expected primary-expression before 'if' 
if (__comp(__a, __b)) 
^ 
/home/erico/.platformio/packages/toolchain-xtensa/xtensa-lx106-elf/include/c++/4.8.2/bits/stl_algobase.h:263:7: error: expected '}' before 'if' 
/home/erico/.platformio/packages/toolchain-xtensa/xtensa-lx106-elf/include/c++/4.8.2/bits/stl_algobase.h:265:7: error: expected unqualified-id before 'return' 
return __a; 
^ 
/home/erico/.platformio/packages/toolchain-xtensa/xtensa-lx106-elf/include/c++/4.8.2/bits/stl_algobase.h:266:5: error: expected declaration before '}' token 
} 
^ 
Compiling .pioenvs/esp12e/FrameworkArduino/MD5Builder.o 
Compiling .pioenvs/esp12e/FrameworkArduino/Print.o 
*** [.pioenvs/esp12e/src/Teste.o] Error 1 
============================================================================================ [ERROR] Took 0.47 seconds ============================================================================================ 

Ai-je raté quelque chose? Peut-être un bug dans Arduino Framework ou Espressif SDK?

+0

Il semble que vous ayez quelque chose dans Teste.h qu'il n'aime pas. Ma Suggestion .. décomposer ou commenter votre code lentement jusqu'à ce qu'il compile. –

+0

L'indice de ce qui se passe est le libellé de votre question: ** macro "min" ** - Aha, c'est une macro, pas une fonction de gabarit. Votre compilateur ou l'un de vos en-têtes a 'min' comme macro, et vous attendez probablement que' std :: min' de '' soit utilisé. – PaulMcKenzie

+0

Aussi [doublon possible] (http://stackoverflow.com/questions/5155621/cant-compile-c-project-macro-max-passed-3-arguments-but-takes-just-2) qui est fondamentalement en indiquant ce que mon commentaire ci-dessus fait allusion à. – PaulMcKenzie

Répondre

3

L'en-tête <Arduino.h> définit les macros max et min. Ça ne devrait vraiment pas faire ça. Pour contourner le problème, ajoutez

#undef max 
#undef min 

juste après votre ligne #include <Arduino.h>.

+0

Oui, mais je n'ai pas défini de modèle min, cette combinaison d'en-tête l'a fait. Ce comportement est normal et dois-je découvrir l'ordre/combinaison pour rendre le compilateur heureux? Notez que j'utilise uniquement le système #includes. –

+0

@ ÉricoGR Non, vous ne définissez pas 'min'. Mais cet en-tête de 3ème partie le fait (inutilement en C++). La façon de contourner ce problème consiste à annuler la définition des macros définies dans l'en-tête. Alors les 'max' et' min' dans les en-têtes de STL fonctionneront correctement. Vous devez également inclure tous les en-têtes de bibliothèque standard dont vous avez besoin avant d'inclure Arduino.h. – 1201ProgramAlarm

+0

@ 1201ProgramAlarm Vous devez toujours inclure les en-têtes * et non standard * après * les en-têtes standard. La raison en est qu'il y a de bonnes chances que ces en-têtes non-standards "polluent" les en-têtes standard avec des définitions, macros, etc .. – PaulMcKenzie