假设我声明了一个带有变量的头文件:
int count;
然后在源文件中,我想使用count
。我是否必须将其声明为:
extern int count
或者我可以在源文件中使用它吗?假设我有#include "someheader.h"
。或者我应该在源文件中声明它? 将头文件中的count
与源文件放在一起有什么区别?或者没关系?
答案 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
。
列出项目