У меня есть структура кода, как этотГлобальный объект в библиотеке для Arduino
myobj.h
#pragma once
struct myobj {
myobj();
...
} Myobj;
myobj.cpp
#include "myobj.h"
myobj::myobj() { ... }
...
mysketch.ino
#include "myobj.h"
Myobj.someMethod();
...
Я понимаю, что это не будет работать, так как Arduino IDE компилирует каждый файл separatedly, так #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 file. Было бы неплохо обнаружить, что myobj.h включен в файл .ino с настройкой и функцией цикла. Возможно ли такое обнаружение без добавления дополнительного кода в этот файл? Есть ли другой способ определить глобальный объект в библиотеке?
Когда я просматриваю другие библиотеки (например, Servo), глобальный объект создается в примере ino. Я могу жить с этим, но есть такие объекты, как Serial
, который каким-то образом создается автоматически, интересно.