【问题标题】:What's the point of creating a header file with extern declarations?创建带有外部声明的头文件有什么意义?
【发布时间】:2013-09-30 11:09:12
【问题描述】:

所以我一直在研究清理我的代码,并找到了有关在单独的 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 不需要重新编译。

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

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

我有什么遗漏吗?

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 我把所有的字符串放在一起。这就是我最后提出的建议。我只是询问如何摆脱标题,让文件自己声明外部变量,但将字符串定义保留在一个文件中。这意味着添加和修改字符串仍然很便宜。所以不是strings.hpp和strings.cpp,我只有strings.cpp。
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2021-07-06
      • 2012-09-23
      • 1970-01-01
      • 1970-01-01
      • 2016-12-09
      • 2010-12-27
      • 1970-01-01
      • 1970-01-01
      • 2019-03-28
      相关资源
      最近更新 更多