1

我再次尝试使用 arduino 并创建一个小模块,只是为了熟练掌握 cpp sintaxe。

我正在尝试使用静态方法创建实用程序模块,并使用标头常量来决定是否必须打印调试消息。

但即使使用#ifndef 来避免重复,我也没有工作

在模块 DataMattersUtil 中,我使用 #ifndef 将标头常量 DATA_MATTERS_DEBUG 设置为 false 以避免重复。但是当我执行此代码时,该消息不会在串行监视器上打印,因为该常量始终为 false,即使在第一个执行的模块 DataMattersRunner.ino 上将其设置为 true。

文件:DataMattersRunner.ino

#define DATA_MATTERS_DEBUG true

#include <DataMattersRunner.h>

DataMattersRunner runner;

void setup() {
  runner.setup();
}

void loop() { }

文件:DataMattersRunner.cpp

#include <DataMattersUtil.h>

void DataMattersRunner::setup() {
  DataMattersUtil::debug("Running ...");
}

文件:DataMattersRunner.cpp

#include <DataMattersUtil.h>

void DataMattersRunner::setup() {
  DataMattersUtil::debug("Running ...");
}

文件:DataMattersUtil.h

#ifndef DATA_MATTERS_DEBUG
#define DATA_MATTERS_DEBUG false
#endif

#ifndef DataMattersUtil_h
#define DataMattersUtil_h

class DataMattersUtil {
  public:
    static void debug(String message);
};

void DataMattersUtil::debug(String message) {
  if(DATA_MATTERS_DEBUG) {
    Serial.println(message);
  }
}
#endif
4

2 回答 2

2

由于DataMattersUtil.h包含在多个编译单元中,您必须DATA_MATTERS_DEBUG在所有编译单元中进行定义。

而不是在所有#define DATA_MATTERS_DEBUG之前添加,您将使用编译器标志来执行此操作。因为它会是 #include <DataMattersUtil.h>gccclang-DDATA_MATTERS_DEBUG

于 2020-07-16T05:05:25.430 回答
1

您的问题是每个 cpp 文件都在不同的编译单元中处理,并且您只DATA_MATTERS_DEBUGtrueDataMattersRunner.ino 中定义。因为您的其他文件位于单独的编译单元中,所以它们看不到 DataMattersRunner.ino 中的定义。

对您来说最好的解决方案可能是提供DATA_MATTERS_DEBUG使用编译器选项。我没有 Arduino 经验,但是使用 gcc 你可以做这样的事情:

g++ -c DataMattersRunner.cpp -DDATA_MATTERS_DEBUG=true
于 2020-07-16T05:05:13.513 回答