![]() |
1
14
包含防护装置确保标题仅包含一次 一个文件 (翻译股)。对于包含标头的多个文件,您希望在每个文件中包含标头。 通过 决定性的 ,而不是 宣布 具有外部链接的变量(全局变量)在头文件中,只能在源文件中包含头。如果将头包含在多个源文件中,将有多个变量定义,这在C++中是不允许的。 因此,正如您所发现的,正是由于上述原因,在头文件中定义变量是一个坏主意。
因为,它们不定义“全局变量”,它们只是关于类型等的声明。它们不保留任何存储。
在头文件中,包含头文件的每个源文件都将获得一个
分离
如果希望数组是从所有C++文件中可见的对象,则应:
您还应该在上面的源文件中包含头文件,以便捕获由于头文件和源文件不同而导致的错误。
|
![]() |
2
5
|
![]() |
3
4
Include guards可防止重复将相同的头文件包含到相同的文件中,但不会将其包含在不同的文件中。
或者,您可以使用一个源文件来定义
|
![]() |
4
0
我尊重地不同意反对在标题中定义变量的建议,因为我认为“从不”太宽泛了。然而,这一事件让我想到了这一点,为那些敢于这样做的人提供了一个警示故事。 在对LNK4006警告的原因进行调查后,我登上了这一页,调用了一个长期建立的数组,我刚刚将该数组从定义DLLMain例程的翻译单元移动到包含在构成该库的大多数翻译单元中的私有标头中。在过去的11年里,我已经编译了数百次这个库,我以前从未见过这个警告。 在阅读本页后不久,我发现了错误的原因,这是因为该定义位于保护块之外,保护模块中定义的所有其他内容,该模块也定义了DLLMain,我通常在该模块中收集所有需要外部链接的内存块。正如预期的那样,将表移动到防护块内消除了警告,只剩下两个与全新外部链接表相关的警告有待解决。
|
![]() |
5
-2
坚持您正在混淆您的声明…您确实说了'char const**temp',但在头文件中有'const char*temp[]={“JeffSter”};'。 见本手册第6.1节 C FAQ 6.1: I had the definition char a[6] in one source file, and in another I declared extern char *a. Why didn't it work? A: In one source file you defined an array of characters and in the other you declared a pointer to characters. The declaration extern char *a simply does not match the actual definition. The type pointer-to-type-T is not the same as array-of-type-T. Use extern char a[]. References: ISO Sec. 6.5.4.2; CT&P Sec. 3.3 pp. 33-4, Sec. 4.5 pp. 64-5. 这就是问题的根源。匹配您的声明和定义。抱歉,如果这听起来很直白,但我忍不住注意到链接器告诉你的。。。 |