我再次尝试使用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
由于DataMattersUtil.h
包含在多个编译单元中,您必须在所有编译单元中定义DATA_MATTERS_DEBUG
。
与其在all#include <DataMattersUtil.h>
之前添加#define DATA_MATTERS_DEBUG
,不如使用编译器标志。对于gcc
和clang
,它将是-DDATA_MATTERS_DEBUG
您的问题是,每个cpp文件都在不同的编译单元中处理,并且您在DataMattersRunner.ino中只定义了DATA_MATTERS_DEBUG
到true
。因为您的其他文件在不同的汇编单元中,所以它们在DataMatters Runner.no中看不到定义。
对您来说,最好的解决方案可能是使用编译器选项提供DATA_MATTERS_DEBUG
。我没有Arduino的经验,但有了gcc,你可以做这样的事情:
g++ -c DataMattersRunner.cpp -DDATA_MATTERS_DEBUG=true