Arduino库中的全局对象

时间:2015-03-06 23:44:46

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

我有像这样的代码结构

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文件中定义这个宏。通过setup和loop函数检测myobj.h是否包含在.ino文件中会很好。如果不在该ino文件中添加任何额外代码,是否可以进行此类检测?有没有其他方法可以在库中定义全局对象?

当我查看其他库(如Servo)时,会在ino示例中创建全局对象。我可以忍受这种情况,但是像Serial这样的对象是以某种方式自动创建的,我不知道如何。

1 个答案:

答案 0 :(得分: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
...