1

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

例如

字符串.hpp

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

字符串.cpp

#include "strings.hpp"

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

我想这是有道理的,但过了一会儿我突然想到这将导致对项目的大块进行不必要的重新编译。例如,如果我将所有字符串放在一起,那么每当我添加一个新字符串时,我都必须修改标题。这意味着每个包含该头文件的 cpp 文件都将被重新编译。随着项目复杂性的增加,这可能会增加,尽管我不确定这是否会花费很多时间。

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

字符串.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不需要重新编译。

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

似乎在进行不影响它们的更改时重新编译多个源文件的时间成本可能比重命名您可能修改或可能不修改的变量的成本要大得多。然而,我从未见过提到的包含声明头的这种缺点。

有什么我想念的吗?

4

2 回答 2

1

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

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

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

于 2013-09-25T03:41:54.130 回答
1

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

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

于 2013-09-25T02:19:23.810 回答