使用extern声明创建头文件有什么意义?

时间:2013-09-25 02:12:30

标签: c++ c string header-files extern

所以我一直在研究清理我的代码,并在一个单独的cpp文件中找到关于定义全局常量(例如char const *字符串)的建议,并使用标头声明它们是extern。然后,您可以在任何需要的地方包含标题,并可以从一个位置访问变量。

例如

strings.hpp

extern char const* strA;
extern char const* strB;

strings.cpp

#include "strings.hpp"

char const* strA = "strA";    
char const* strB = "strB";

这是有道理的,我想,但有一点后我发现这将导致不必要的重新编译项目的大块。例如,如果我将所有字符串保持在一起,每当我添加新字符串时,我都必须修改标题。这意味着将重新编译包含该标头的每个cpp文件。随着项目的复杂性增加,这可能会增加,但我不确定它是否会花费很多时间。

在我看来,这个问题的解决方案是保持这个想法,但不是包括标题,而是在一个cpp文件中声明和定义常量:

strings.cpp

extern char const* strA;
extern char const* strB;

char const* strA = "strA";    
char const* strB = "strB";

然后在任何需要字符串的文件中,我声明了所需的变量

A.cpp

extern char const* strA;

B.cpp

extern char const* strB;

基本上,手动执行包含会为我做的事情。

不同之处在于,如果我以后需要添加一个char const * strC,在C.cpp中使用,我在strings.cpp中添加extern声明和定义,在C.cpp和A.cpp中再次声明它。 B.cpp不需要重新编译。

这种方法的缺点是代码重复。我不必一次声明变量并包含声明,而是必须在我想要使用它的任何地方声明每个变量。问题是如果我决定重命名变量,我必须在几个地方重命名它。但话说回来,如果我重命名一个变量,我必须修改所有使用它的文件,即使包含了声明。而且无论如何我都可以进行全局重命名。

在进行不影响它们的更改时,重新编译多个源文件的成本似乎远远大于重命名您可能修改或不修改的变量的成本。然而,我从来没有看到提到的包含声明标题的这种缺点。

我有什么遗失的吗?

2 个答案:

答案 0 :(得分:1)

如果更改字符串,则只需重新编译该文件即可。添加字符串很昂贵,但修改字符串非常便宜。另一个好处是你的所有字符串都在一个地方。如果您决定要更改一个,则不必搜索许多文件,或者如果您想翻译程序,则更容易。

如果你的项目中有很多字符串,可能会将它们分组,而不是将它们全部放在同一个标​​题中。另请记住,如果您不使用其中任何一个,请不要包含该标题。

答案 1 :(得分:1)

在多个文件中包含相同的标头可确保每个使用该标识符的源文件都能看到相同的声明。这可以减少错误。

如果各种源文件使用且未使用的声明的各种子集,则可以将声明划分为多个标头A.hB.hC.h,每个标题只包含使用其声明的源文件。然后,当在B.h中更改声明时,不需要重新编译包含A.hC.h但不包含B.h的源文件。

在某种程度上,是的,有一些不必要的重新编译,因为有时一个声明在标题中发生变化,导致编译使用标题的源文件而不是更改的声明。这通常被认为是一个小成本,有利于避免重复代码导致的错误和复杂性。