繁体   English   中英

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

[英]What's the point of creating a header file with extern declarations?

因此,我一直在研究清理代码,并找到了有关在单独的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;

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

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

这种方法的缺点是代码重复。 不必一次声明变量并包括声明,而是必须在要使用它的任何位置声明每个变量。 这样做的问题是,如果我决定重命名变量,则必须在多个位置重命名。 但是再说一次,如果我重命名了一个变量,那么即使包含了声明,我也必须修改所有使用它的文件。 而且我仍然可以进行全局重命名。

似乎在进行不影响它们的更改时重新编译几个源文件所花费的时间可能比重命名可能会或可能不会修改的变量所花费的时间要大得多。 但是,我从未见过提到的包含声明标头的不利方面。

我有什么想念的吗?

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

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

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

如果各种源文件使用了声明的各种子集,而这些子集没有使用这些声明的子集,则可以将这些声明分为多个标头AhBhCh ,并且每个标头仅包含使用其声明的源文件。 然后,当在声明改变Bh ,源文件,其中包括AhCh ,但没有Bh不需要重新编译。

在某种程度上,是的,有一些不必要的重新编译,因为有时在标头中会更改声明,导致编译使用标头但未更改声明的源文件。 为了避免重复代码所引起的错误和复杂性,通常将其视为小成本。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM