2013-05-02 2 views
0

Я пишу Arduino библиотеку и имеет структуру папок следующим образом:Конфликта включать файлы из библиотеки Arduino

libraries 
    +Foo 
    -Foo.h 
    -Helper.h 
    +Bar 
    -Bar.h 
    -Helper.h 
    +Helper 
    -Helper.h 

Foo и Bar являются библиотеками я создал. Основанием для размещения Helper.h в своих папках является то, что у конечного пользователя будет легче работать с библиотеками. Кроме того, некоторые библиотеки могут быть настроены только путем редактирования исходного кода.

Однако, если я напишу #include <Helper.h> в своем sketch, невозможно будет контролировать, какой «Helper.h» я включил.

Есть ли способ скрыть Helper.h от Foo и Bar от эскизов?

+2

Да, не добавляйте 'Foo',' Bar' или 'Helper' в путь include и включайте' Foo/Helper.h' и 'Bar/Helper.h'. Или придумайте имена лучше, чем 'Helper.h'. – juanchopanza

+0

@juanchopanza 'Helper.h' - это просто имя заполнителя, вы можете думать об этом как« Fat16.h »или что-то в этом роде. Можете ли вы подробнее рассказать об этом и дать ответ?Здесь трудно понять. –

ответ

1

Очевидный ответ: не пишите #include <Helper.h>. Ваши файлы не являются частью реализации и должны быть включены с использованием . Если вы сделаете это, первое место , то компилятор будет искать файл include в каталоге , содержащий файл, который включает его: если вы включите его из Foo/Foo.h, компилятор подберет Foo/Helper.h; если вы включите от Bar/Bar.h, компилятор заберет Bar/Helper' и и так далее.

Код клиента должен устанавливать только путь включения к корню и делать вещи, подобные #include "Foo/Foo.h"; при необходимости, они также могут сделать #include "Foo/Helper.h".

Единственное, что вам нужно сделать с этой стратегией, - обеспечить уникальность всех защитников заголовков. Если это приложение , его обычно будет достаточно, чтобы кастовать путь в защитный кожух, например. используйте Foo_Helper_h, а не только Foo_h. В качестве альтернативы (и я использовал бы это для любой библиотеки , которую должны использовать третьи стороны), сгенерируйте некоторую случайную строку для защитника включения. (Если я открываю файл с именем abc.h которого не существует, мой редактор автоматически генерирует следующий шаблонный:.

/********************************************************/ 
/*  File:  abc.h        */ 
/*  Author:  J. Kanze       */ 
/*  Date:  02/05/2013       */ 
/* ---------------------------------------------------- */ 

#ifndef abc_h_20130502O481MBxFZeAzz4dgIb7iC4Q9 
#define abc_h_20130502O481MBxFZeAzz4dgIb7iC4Q9 

#endif 

Это безопасная ставка, что включает в себя охрану здесь никогда не будет конфликтовать с любым другим (и вы должны сделать что-то вдоль этих линий в любом случае, для того, чтобы получить информацию об авторских правах в файле)

0

Просто понял, так, что, казалось бы, решает эту проблему:.

libraries 
    +Foo 
    -Foo.h 
    +extra 
     -Helper.h 
    +Bar 
    -Bar.h 
    +extra 
     -Helper.h 
    +Helper 
    -Helper.h 

Таким образом, Helper.h в Foo и Bar будет невидимым для клиентов, и я могу написать #include "extra/Helper.h" в Foo и Bar соответственно включить нужные файлы.

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