#定义c-预处理器常量..我做错了什么

#define c-preprocessor constants ... what did I wrong?

本文关键字:错了 什么 常量 处理器 定义 预处理      更新时间:2023-10-16

我再次尝试使用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,不如使用编译器标志。对于gccclang,它将是-DDATA_MATTERS_DEBUG

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

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

g++ -c DataMattersRunner.cpp -DDATA_MATTERS_DEBUG=true