gpt4 book ai didi

c++ - Arduino 库中的全局对象

转载 作者:行者123 更新时间:2023-11-28 06:23:36 26 4
gpt4 key购买 nike

我有这样的代码结构

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 是在链接阶段创建了两次)。

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

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)是以某种方式自动创建的,我想知道是如何创建的。

最佳答案

啊,我在 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
...

关于c++ - Arduino 库中的全局对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28909538/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com