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

标签 c++ c string header-files extern

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

例如

字符串.hpp

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

字符串.cpp

#include "strings.hpp"

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

我认为这是有道理的,但过了一会儿我想到这将导致对项目的大块进行不必要的重新编译。例如,如果我将所有字符串放在一起,每当我添加一个新字符串时,我都必须修改标题。这意味着每个包含该 header 的 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;

本质上,手动执行 include 会为我完成的操作。

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

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

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

有什么我遗漏的吗?

最佳答案

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

如果您的项目中分布着许多字符串,也许可以将它们分组而不是将它们全部放在同一个标​​题中。另请记住,如果您不使用它们中的任何一个,则不要包含该 header 。

关于c++ - 使用 extern 声明创建头文件有什么意义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18995087/

相关文章:

C++如何将 vector 表示为矩阵并转置它?

c++ - 在 C++ 中,是否有通过字符串调用对象属性的方法?

c - 访问指针使其值改变

c - Libpq 使用大量内存的简单示例

python - 汉明距离的倒数

c++ - 是否有适用于 Windows (Visual C) 的 unistd.h 的替代品?

使用预定义参数引用 C++ 函数

c - 在 c 中不使用除法运算符来除一个数

java - 包含 5 个数字或没有数字的字符串的正则表达式

java - 解析带有分隔符的字符串并将其加载到映射中?