我有这样的代码结构
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文件之外的任何地方定义此宏。最好通过设置和循环功能检测myino.h是否包含在.ino文件中。是否可以在不向该ino文件中添加任何额外代码的情况下进行这种检测?还有其他方法可以在库中定义全局对象吗?
当我查看其他库(例如Servo)时,在ino示例中创建了全局对象。我可以忍受,但是有些像
Serial
这样的对象以某种方式自动创建,我想知道如何。 最佳答案
啊,我在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
...