2

我发现了一个在C中运行良好但导致 Arduino 出现问题的问题(在 Windows 上)

#define NO_PROBLEM
#ifdef NO_PROBLEM
  char charBuf[16];
  unsigned int numBuf;
#endif

void setup() {
}
void loop() {
}

这段代码工作正常。但如果我改变

#define NO_PROBLEM

//#define NO_PROBLEM

编译器将返回以下错误:

core.a(main.cpp.o): 在函数 main: C:\Users\user\arduino-1.0.4-windows\arduino-1.0.4\hardware\arduino\cores\arduino/main.cpp:5:对设置 C:\Users\user\arduino-1.0.4-windows\arduino-1.0.4\hardware\arduino\cores\arduino/main.cpp:15 的未定义引用:对循环的未定义引用

这是一些调试宏的一部分,我希望一些变量只在调试模式下存在,所以实际上 NO_PROBLEM 在我的代码中是调试。

4

1 回答 1

2

这是 IDE 中与原型生成相关的错误。将 IDE 设置更改为详细的编译器输出。如果您查看构建目录并搜索生成的 .cpp 文件,您将看到以下内容:

//#define NO_PROBLEM
#ifdef NO_PROBLEM
  #include "Arduino.h"
void setup();
void loop();
char charBuf[16];
  unsigned int numBuf;
#endif

void setup() {
}
void loop() {
}

对比

#define NO_PROBLEM
#ifdef NO_PROBLEM
  #include "Arduino.h"
void setup();
void loop();
char charBuf[16];
  unsigned int numBuf;
#endif

void setup() {
}
void loop() {
}

这解释了为什么编译器不会使用注释进行编译。

一种解决方法是确保 IDE 可以在宏定义之前获取某些内容,这些内容将被编译器优化掉。例如

namespace trick17 {};
//#define NO_PROBLEM
#ifdef NO_PROBLEM
  char charBuf[16];
  unsigned int numBuf;
#endif

void setup() {
}
void loop() {
}

现在生成的 .cpp 文件变为

#include "Arduino.h"
void setup();
void loop();
namespace trick17 {};
//#define NO_PROBLEM
#ifdef NO_PROBLEM
  char charBuf[16];
  unsigned int numBuf;
#endif

void setup() {
}
void loop() {
}

这编译OK。

于 2013-10-23T21:07:33.727 回答