我有这样的代码结构

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
...

07-28 03:06