【问题标题】:#define c-preprocessor constants ... what did I wrong?#define c-preprocessor constants ...我做错了什么?
【发布时间】:2020-07-16 04:51:33
【问题描述】:

我再次尝试使用 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

【问题讨论】:

    标签: c++ arduino c-preprocessor ifndef


    【解决方案1】:

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

    而不是在 all #include &lt;DataMattersUtil.h&gt; 之前添加 #define DATA_MATTERS_DEBUG 您将使用编译器标志来执行此操作。对于gccclang,它将是-DDATA_MATTERS_DEBUG

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多