将变量放入标题与将变量放入源中的区别

时间:2010-04-15 22:29:15

标签: c header extern

假设我声明了一个带有变量的头文件:

int count;

然后在源文件中,我想使用count。我是否必须将其声明为:

extern int count

或者我可以在源文件中使用它吗?假设我有#include "someheader.h"。或者我应该在源文件中声明它? 将头文件中的count与源文件放在一起有什么区别?或者没关系?

4 个答案:

答案 0 :(得分:7)

你只想要一个count变量,对吗?那么这一行:

int count;

为您定义count变量。如果你将它粘贴在多个文件中(通过将其包含在标题中),那么你将拥有多个count变量,每个文件对应一个变量,并且你会得到错误,因为它们都具有相同的名称。

所有extern关键字都表示在其他文件中定义了count变量,我们只是让编译器知道它,以便我们可以在此文件中使用它。因此,extern声明是您要放在标题中以便其他文件包含的声明。将int count;定义放在一个源文件中。

答案 1 :(得分:2)

如果你确实将它放入标题中,那么是的,你可以在源文件中使用它而不需要任何进一步的声明(无论如何,在标题为#include d之后)。

#include "someheader.h"实际上只是复制了someheader.h的内容,就好像它在那时直接写在包含文件中一样。

但是,这是你应该使用标题的方式。 int count;是一个暂定的定义 - 您应该只将声明放在头文件中。所以someheader.h应该有:

extern int count;

(这只是一个声明),并且应用程序中的一个源文件应该定义 count

int count = 0;

其他人只需#include "someheader.h"并使用count

答案 2 :(得分:1)

如果你放

那就不一样了
int count;
标题中的

如果标题包含在多个源文件中,您将得到重新定义错误只将该行放在源文件中将导致var仅在该源文件中可用(其他源文件中的代码将不知道那个var,你将能够用该名称声明另一个var。)

在标题中,您必须输入

extern int count;

并在sounrce文件中

int count;

这将导致声明一个全局变量,可用于包含标题的所有源文件。并且没有重新定义错误。

答案 3 :(得分:0)

实际编译的文件是预处理器吐出的文件,而不是source.c文件。

因此,如果您将int count;放在一个头文件中,#include标题的每个源文件都会获得它自己的count副本。

在这种情况下,您将拥有如下所示的来源:

int count; 

...

extern int count; 

如果您使用的是gcc,请尝试gcc -E file.c。这将指示它只运行预处理器,以便您可以看到实际输入到编译器的内容。

正如@Neil建议的那样,您需要在C文件中声明int count;。如果您希望另一个C文件能够引用此变量,那么您将extern int count;声明放在另一个文件中(或另一个包含的头文件中)。


顺便提一下,我最喜欢的C错误之一是当你声明一个这样的全局变量:int count;,然后在另一个文件中声明另一个具有相同名称的全局变量,但是另一个类型float count; 。在第一个文件中,您说count = 1,然后第二个文件中的count突然变为-0.0。故事的道德启示?避免使用全局变量,如果必须使用它们,请将它们设为static

列出项目