Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 什么';创建带有外部声明的头文件有什么意义?_C++_C_String_Header Files_Extern - Fatal编程技术网

C++ 什么';创建带有外部声明的头文件有什么意义?

C++ 什么';创建带有外部声明的头文件有什么意义?,c++,c,string,header-files,extern,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 con

因此,我一直在研究清理我的代码,并发现了关于在单独的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";
extern char const* strA;
extern char const* strB;

char const* strA = "strA";    
char const* strB = "strB";
我认为这是有道理的,但过了一段时间,我突然想到,这将导致不必要地重新编译项目的大块内容。例如,如果我将所有字符串放在一起,每当我添加新字符串时,我都必须修改标题。这意味着包含该头的每个cpp文件都将被重新编译。随着一个项目变得越来越复杂,这可能会累加起来,尽管我不确定这是否需要很多时间

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

strings.cpp

#include "strings.hpp"

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

char const* strA = "strA";    
char const* strB = "strB";
然后在任何需要字符串的文件中,我声明所需的变量

A.cpp

B.cpp

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

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

这种方法的缺点是代码重复。与一次性声明变量并包含声明不同,我必须在任何我想使用它的地方声明每个变量。问题是,如果我决定重命名变量,我必须在几个地方重命名它。但是再一次,如果我重命名一个变量,我必须修改所有使用它的文件,即使声明包含在内。我可以做一个全局重命名

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


是否缺少任何内容?

如果更改字符串,只需重新编译该文件。添加字符串很昂贵,但修改字符串很便宜。另一个好处是所有字符串都位于一个位置。如果你决定要更改一个,你不必在许多文件中搜索它,或者如果你想翻译你的程序,那就更容易了


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

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

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


在某种程度上,确实存在一些不必要的重新编译,因为有时头中的声明会发生更改,导致编译使用头但不使用更改的声明的源文件。这通常被认为是一个小成本,以避免重复代码造成的错误和复杂性。

我将所有字符串放在一起。这就是我最后的建议。我只是想去掉头,让文件自己声明外部变量,但将字符串定义保留在一个文件中。这意味着添加和修改字符串都很便宜。因此,我只有strings.cpp,而不是strings.hpp和strings.cpp。