所以我做了一个复杂的项目,现在我有太多的包含文件让我很头疼。我怎样才能最好地管理这些课程?有些类需要使用其他类。我还有一个 .h 文件,其中包含一堆 int 数组。这些在应用程序中保持不变,但是当编译器抱怨我正在重新定义数组时,我遇到了问题。
我应该做一个类库吗?命名空间?动态链接库?最佳做法是什么?我在哪里可以找到正确的做法?
所以我做了一个复杂的项目,现在我有太多的包含文件让我很头疼。我怎样才能最好地管理这些课程?有些类需要使用其他类。我还有一个 .h 文件,其中包含一堆 int 数组。这些在应用程序中保持不变,但是当编译器抱怨我正在重新定义数组时,我遇到了问题。
我应该做一个类库吗?命名空间?动态链接库?最佳做法是什么?我在哪里可以找到正确的做法?
文件.h
#ifndef FILE_H_INCLUDED #define FILE_H_INCLUDED void foo(); #endif
extern
并将定义放在.cpp
文件中。文件.h
extern int var[20];
文件.cpp
int var[20];
有用的.h
class Useful {};
其他.h
// Forward-declare instead of #include class Useful; class Other { Useful* helper; };
我不认为真的有最佳实践,这取决于情况。我可能会建议将类似对象分组到命名空间中,然后将所有定义放在一个 .h 文件中。如果实现很短,请将它们全部放在一个 cpp 文件中。在我的工作中,我们有一个像这样的数据库访问层。大约有几十个对象由存储的过程填充。该代码仍然是一个主要的痛苦,但它比拥有两个少于 500 行的 .h 和 cpp 文件要好。如果你这样做,将对象定义区分开来的注释变得非常重要。您可以轻松获得超过 10,000 行的文件,因此您需要一些东西来分解它们。
当然使用包括警卫,他们可能会解决重新定义的错误。
您需要知道定义和声明之间的区别,以及实体的哪些用途需要声明实体。然后你还需要学习“一个定义规则”(ODR),它告诉你什么时候不允许在程序中有多个定义(因此定义不能放在标题中)以及什么事情只要定义相同,就可以多次定义(因此定义可以放在标题中)。
例如,您要声明的那些数组;由于这些是全局可见的数组,程序只能包含一个定义,因此该定义不能放在标题中。需要访问它们的程序的每个部分只需要知道它们的声明。因此,不要将定义放在头文件中并违反 ODR,而应该有一个包含其定义的 C++ 文件和一个包含它们的声明的头文件。
像这样的代码:
int foo[100];
都声明并定义了数组foo
。将这样的代码放入 C++ 文件中。要仅声明此数组,请执行以下操作:
extern int foo[100];
将这样的代码放在标题中。
类定义、内联函数和模板都是可以多次定义的,只要定义相同。您可以将这些定义放在头文件中,而常规函数和全局变量只能定义一次,因此您在头文件中声明它们,然后在实现文件中定义它们。