在条件宏中定义变量会产生错误

时间:2013-10-21 17:38:33

标签: c variables arduino c-preprocessor conditional-compilation

我发现一个问题在 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:未定义的循环引用

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

1 个答案:

答案 0 :(得分: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() {
}

VS

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

这可以编译好。