我有像这样的代码结构
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
这样的对象是以某种方式自动创建的,我不知道如何。
答案 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
...