【问题标题】:Global object in library for ArduinoArduino 库中的全局对象
【发布时间】:2015-03-06 23:44:45
【问题描述】:

我有这样的代码结构

myobj.h

#pragma once
struct myobj {
  myobj();
  ...
} Myobj;

myobj.cpp

#include "myobj.h"
myobj::myobj() { ... }
...

mysketch.ino

#include "myobj.h"
Myobj.someMethod();
...

我知道这行不通,因为 Arduino IDE 分别编译每个文件,所以 #pragma once 不会帮助我避免链接阶段的多重定义错误(Myobj 被创建了两次)。

我不想打扰我未来库的用户自己创建全局对象(无论如何,该对象将用作单例)。工作思路是使用宏:

myobj.h

#pragma once
struct myobj {
  myobj();
  ...
};
#ifndef _MYOBJ_
myobj Myobj;
#endif

myobj.cpp

#define _MYOBJ_
#include "myobj.h"
myobj::myobj() { ... }
...

但是我必须记住在除 ino 文件之外的任何地方定义此宏。很高兴检测到 myobj.h 包含在具有设置和循环功能的 .ino 文件中。是否可以在该 ino 文件中不添加任何额外代码的情况下进行这种检测?有没有其他方法可以在库中定义全局对象?

当我查看其他库(如 Servo)时,在 ino 示例中创建了全局对象。我可以忍受,但是有像Serial 这样的对象是自动创建的,我想知道如何。

【问题讨论】:

    标签: c++ object arduino header-files arduino-ide


    【解决方案1】:

    啊,我在SD库里找到了解决办法:一个聪明的extern关键字!

    myobj.h

    #pragma once
    struct myobj {
      myobj();
      ...
    };
    extern myobj Myobj;
    

    myobj.cpp

    #include "myobj.h"
    myobj::myobj() { ... }
    ...
    myobj Myobj;
    

    mysketch.ino

    #include "myobj.h"
    Myobj.someMethod(); // works, no multiple definition error
    ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-09
      • 2011-05-07
      • 2014-10-14
      • 2013-03-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多