gpt4 book ai didi

arduino - 在 Arduino IDE 的#if#else #endif 中定义变量

转载 作者:行者123 更新时间:2023-12-01 08:12:46 24 4
gpt4 key购买 nike

我希望有人能阐明为什么这段代码不能在 Arduino IDE(使用 1.0.5)中编译。以下代码仅在 DEBUG=1 时编译,但在设置为 0 时不编译。

我希望实现的只是一种简单的方法,即在我更换 LED 驱动器时使用相同的代码,并在重新编译和上传之前翻转 DEBUG 位。

注意:此示例是在IDE中编译的全部代码(不需要其他代码)。

问题代码:

#define DEBUG 0 //DEBUG=1 works, DEBUG=0 causes compiler error

#if DEBUG == 1
int x = 123;
//Adafruit_8x8matrix matrix = Adafruit_8x8matrix();
#else
int x = 567;
//Adafruit_BicolorMatrix matrix = Adafruit_BicolorMatrix();
#endif

void setup() { }

void loop() { }

错误:

core.a(main.cpp.o): In function `main':
C:\arduino\hardware\arduino\cores\arduino/main.cpp:11: undefined reference to `setup'
C:\arduino\hardware\arduino\cores\arduino/main.cpp:14: undefined reference to `loop'

最佳答案

原因是 Arduino IDE 很烂。在引擎盖下它会像这样生成 C 代码

#define DEBUG 0 //DEBUG=1 works, DEBUG=0 causes compiler error

#if DEBUG == 1
int x = 123;
//Adafruit_8x8matrix matrix = Adafruit_8x8matrix();
#else
int x = 567;
//Adafruit_BicolorMatrix matrix = Adafruit_BicolorMatrix();
#endif

void setup() { }

void loop() { }

因此,如果 debug==0,编译器将看不到生成的函数原型(prototype)。只需将编译器输出设置为详细并在构建目录中查看生成的代码。

所有这些痛苦的解决方案是找到一些方法来阻止 IDE 搞乱你的东西。过去我在函数原型(prototype)方面遇到过一些类似的问题,我用 TRICK17 宏解决了这些问题(有关详细信息,请参阅 here)。我不会深入讨论这个宏的困惑实现,因为现在我找到了一个非常优越的解决方案。

  • IDE 不知道命名空间
  • 因此它不会触及 namespace 内的任何内容
  • 一个空的命名空间名称是可以接受的,这将建立一个匿名命名空间。此命名空间中的实体不需要前缀来寻址它们。

因此新的解决方案是

namespace {
// name of namespace left empty --> this is the anonymous namespace
// now the IDE will not mess with our stuff

#define DEBUG 0 //DEBUG=1 works, DEBUG=0 causes compiler error

#if DEBUG == 1
int x = 123;
//Adafruit_8x8matrix matrix = Adafruit_8x8matrix();
#else
int x = 567;
//Adafruit_BicolorMatrix matrix = Adafruit_BicolorMatrix();
#endif
}

void setup() { }

void loop() { }

关于arduino - 在 Arduino IDE 的#if#else #endif 中定义变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28177544/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com