Очевидный ответ: не пишите #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
Это безопасная ставка, что включает в себя охрану здесь никогда не будет конфликтовать с любым другим (и вы должны сделать что-то вдоль этих линий в любом случае, для того, чтобы получить информацию об авторских правах в файле)
Да, не добавляйте 'Foo',' Bar' или 'Helper' в путь include и включайте' Foo/Helper.h' и 'Bar/Helper.h'. Или придумайте имена лучше, чем 'Helper.h'. – juanchopanza
@juanchopanza 'Helper.h' - это просто имя заполнителя, вы можете думать об этом как« Fat16.h »или что-то в этом роде. Можете ли вы подробнее рассказать об этом и дать ответ?Здесь трудно понять. –