2015-03-06 3 views
0

У меня есть структура кода, как этотГлобальный объект в библиотеке для 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, который каким-то образом создается автоматически, интересно.

ответ

0

Ах, я нашел решение в библиотеке 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 
... 

 Смежные вопросы

  • Нет связанных вопросов^_^