【问题标题】:ESP8266 error: macro "min" passed 3 arguments, but takes just 2ESP8266 错误:宏“min”传递了 3 个参数,但只需要 2 个
【发布时间】:2016-12-12 01:37:25
【问题描述】:

我正在使用 PlatformIO 用 Arduino 框架编译我的 ESP8266 (ESP12e)。在某些时候,如果我按特定顺序使用 #include 就会出错。

下面是我的简化代码:

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() {}

输出

$ 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 ============================================================================================

我错过了什么吗?可能是 Arduino Framework 或 Espressif SDK 中的错误?

【问题讨论】:

  • 看起来你在 Teste.h 中有一些它不喜欢的东西。我的建议.. 慢慢分解或注释您的代码,直到它编译为止。
  • 所发生的事情的线索是你的问题的措辞:macro “min” -- 啊哈,它是一个宏,而不是一个模板函数。您的编译器或您的头文件之一具有 min 作为宏,并且您可能期望使用来自 &lt;algorithm&gt;std::min
  • 另外possible duplicate 基本上说明了我上面提到的评论。

标签: c++ compilation esp8266 arduino-esp8266 platformio


【解决方案1】:

&lt;Arduino.h&gt; 标头定义了 maxmin 宏。它真的不应该那样做。要解决此问题,请添加

#undef max
#undef min

就在您的#include &lt;Arduino.h&gt; 行之后。

【讨论】:

  • 是的,但我没有定义最小模板,这个标题组合定义了。这种行为是正常的,我是否需要发现顺序/组合才能让编译器满意?请注意,我只使用系统#includes。
  • @ÉricoGR 不,你没有定义min。但是第 3 方标头可以(在 C++ 中是不必要的)。解决这个问题的方法是取消定义标题中定义的宏。然后 STL 标头中的 maxmin 将正常工作。或者您需要在包含 Arduino.h 之前包含所有您需要的标准库头文件。
  • @1201ProgramAlarm 您应该始终包含非标准标题和标准标题之后。原因是那些非标准头文件很有可能会“污染”具有冲突定义、宏等的标准头文件。
  • @1201ProgramAlarm " 标头定义了最大和最小宏。它真的不应该那样做"。那么,它可以被认为是 Arduino 库中的一种 bug?
  • @ÉricoGR 这是一个需要与 C 和 C++ 一起使用的标头。在为 C++ 编译时,由于像您这样的问题,它可能不应该定义这些宏。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-06
  • 1970-01-01
  • 1970-01-01
  • 2016-11-14
  • 2021-07-23
  • 2021-05-06
  • 1970-01-01
相关资源
最近更新 更多