显而易见的答案是:不要写#include <Helper.h>
。您的文件不是实现的一部分,应该使用#include "Helper.h"
. 如果这样做,编译器首先会在包含包含它的文件所在的目录中查找包含文件:如果从 中包含它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
可以肯定的是,这里的包含守卫永远不会与任何其他守卫发生冲突。(无论如何,您都必须按照这些方式做一些事情,以便在文件中获取您的版权信息。)