【发布时间】:2011-05-06 23:10:55
【问题描述】:
如何包含两个都具有#include "h_file.h" 的 .h/class 文件?两者都需要 .h 文件定义,并且都包含在主程序中。如何防止重新定义 .h 定义(导致编译器无法编译)?
我有:
main.cpp
class1.h/class1.cpp
class2.h/class2.cpp
h_file.h
【问题讨论】:
如何包含两个都具有#include "h_file.h" 的 .h/class 文件?两者都需要 .h 文件定义,并且都包含在主程序中。如何防止重新定义 .h 定义(导致编译器无法编译)?
我有:
main.cpp
class1.h/class1.cpp
class2.h/class2.cpp
h_file.h
【问题讨论】:
使用包含守卫:
#ifndef INCLUDE_GUARD_IDENTIFIER_GOES_HERE
#define INCLUDE_GUARD_IDENTIFIER_GOES_HERE
// code for header
#endif
第二次包含它时,它实际上是一个空文件。
选择标识符INCLUDE_GUARD_IDENTIFIER_GOES_HERE 的方法有很多种,每种方法都有其基本原理。我个人是FILE_DIRECTORY_FILE_NAME_CLASS/FUNCTION_NAME_HPP:
#ifndef UTILITY_FOO_HPP
#define UTILITY_FOO_HPP
namespace utility
{
void foo();
}
#endif
其他人将生成 GUID 并将它们附加到基本名称,如下所示:
INCLUDE_GUARD_A629F54A136C49C9938CB33EF8EDE676
这几乎可以保证它永远不会发生碰撞。最终,这取决于你。但是,无论您想出什么,请确保它遵循the rules:任何地方都没有双下划线,并且不要以下划线后跟大写字母开头。
【讨论】:
./utility/blah.hpp 包含类似于namespace utility { void blah(); } 的函数(或类),带有保护UTILITY_BLAH_HPP。如果它打算在我自己的工作之外使用,我也会在它前面加上一个项目名称。