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

假设我使用变量声明头文件:

int count; 

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

 extern int count 

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

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

 int count; 

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

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

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

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

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

 extern int count; 

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

 int count = 0; 

其他人可以#include "someheader.h"并使用count

如果你把它放在一起的区别

 int count; 

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

在标题中,你必须把

 extern int count; 

并在sounrce文件中

 int count; 

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

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

所以,如果你把int count; 在头文件中,每个#include s标头的源文件都会得到它自己的count副本。

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

 int count; ... extern int count; 

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

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


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

项目清单