假设我声明了一个带有变量的头文件:
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
in 的内容,就好像它当时都直接写在包含文件中一样。
但是,这不是您应该使用标题的方式。 int count;
是一个暂定定义 - 您应该只将声明放在头文件中。所以someheader.h
应该有:
extern int count;
(这只是一个声明),并且您的应用程序中的一个源文件应该定义 count
:
int count = 0;
其他的可以随便#include "someheader.h"
用count
。
如果你把它的区别
int count;
在标头中,如果标头包含在多个源文件中,您将收到重新定义错误将该行仅放在源文件中将导致 var 仅在该源文件中可用(其他源文件中的代码将不知道该 var 并且您将能够声明另一个具有该名称的 var)。
在标题中,您必须输入
extern int count;
并在源文件中
int count;
这将导致声明一个全局变量,可用于包含您的标头的所有源文件。并且没有重新定义错误。
实际编译的文件是预处理器输出的文件,而不是 source.c 文件。
所以,如果你放入int count;
一个头文件,每个作为头文件的源文件#include
都会得到它自己的count
.
在这种情况下,您将获得如下所示的源代码:
int count;
...
extern int count;
如果您使用 gcc,请尝试gcc -E file.c
. 这将指示它仅运行预处理器,以便您可以看到实际提供给编译器的内容。
正如@Neil 建议的那样,您需要int count;
在 C 文件中声明。如果您希望另一个 C 文件能够引用此变量,则extern int count;
在另一个文件(或另一个包含的头文件)中放置一个声明。
顺便说一句,我最喜欢的 C 错误之一是当您声明一个像这样的全局变量时:int count;
,然后在另一个文件中声明另一个具有相同名称但类型不同的全局变量float count;
。在第一个文件中,您说count = 1
,然后第二个文件中的突然count
变成-0.0
. 故事的道德启示?避免使用全局变量,如果必须使用它们,请将它们设为static
.
项目清单