这个问题在这里已有答案:
嗨,我现在是C ++开发人员,我正在做C编程。
我的问题是哪个地方更适合在c程序中声明全局变量。头文件或源文件(假设我的全局变量未在其他文件中使用)?
我希望这个变量像C ++中的私有变量一样。
假设您的变量是全局变量而非静态变量。
您需要在头文件中声明它。我们使用extern
关键字。正如评论中所指出的,这个关键字不是必需的,但大多数C用户更喜欢在标题中使用它,这是一种约定。
stackoverflow.h:
#ifndef STACHOVERFLOW_H
#define STACHOVERFLOW_H
extern int my_var;
#ifndef
并在源文件中初始化它。 (如果要提供初始化值,则禁止使用关键字extern
)。
stackoverflow.c
#include "stackoverflow.h"
int my_var = 50;
不要将初始化值放在标头中,否则如果标头至少使用两次,则会出现链接器错误。
现在,您可以通过包含标题在任何其他模块中使用您的变量。
main.c中
#include <stdio.h>
#include "stackoverflow.h"
int main()
{
printf("my_var = %d\n", my_var);
return 0;
}
在“stackoverflow.c”中包含标题“stackoverflow.h”是一种确保源文件中的定义匹配头文件中的声明的方法。这允许在编译时出现错误,而不是有时会出现神秘的链接器错误。
编辑:这并不是使变量“私有”的方式。您必须使用静态变量使其“私有”。见R Sahu's answer
您不应将全局非常量变量放在任何位置。使用extern
声明全局,并可用于整个项目。这样做的必要性总是源于糟糕的程序设计,时期。对于C和C ++都是如此。
唯一的例外是const
变量,它可以很好地分享多个文件。
如果您需要文件范围变量,则应在.c文件中声明它们,并始终为static
。不要将这些混淆为“全局”,因为它们是声明它们的翻译单元的本地。 More info about how static
file scope variables can make sense。
另请注意C标准的未来语言方向:
在没有静态存储类说明符的情况下在文件范围内声明具有内部链接的标识符是一个过时的功能。
因此,如果您不使用static
,您的代码可能无法在下一版本的C标准中编译。
哪个地方最好在c程序中声明一个全局变量
答案:在源(* .c)文件中。
假设这样的场景,我在头文件中声明了一个变量。我将此标头包含在两个不同的.c文件中。在编译的宏扩展步骤之后,这两个文件将具有相同名称的全局变量。因此它会在链接时间内抛出一个错误,就像变量的多个声明一样。
结论:-
将所有全局变量声明保存在.c文件中,如果在其他文件中不需要,则将其设置为static
。
如果需要从其他文件访问,请在相应的头文件中添加变量的extern
声明
如果您打算在多个.c文件中使用全局变量,最好在.h文件中声明它们。但是,如果要在C ++中保留类的private
成员数据等变量,最好通过函数提供对全局数据的访问。
代替
extern int foo;
使用
int getFoo();
void setFoo(int);
这类模仿了类的成员变量的private
访问说明符。
通常你可以做的是在源文件中定义变量,比如int g_foo;
,然后在extern的其他文件中引用this global,比如extern int g_foo; do_sth(g_foo);
。您可以将extern int g_foo;
声明放在头文件中,并将其包含在其他源文件中。不建议在头文件中定义数据。
如果您希望它是全局的(外部链接),您应该将它放在.h文件中。我认为这是最好的做法之一:
public_header.h
#ifdef YOUR_SOURCE
#define EXTERN
#else
#define EXTERN extern
#endif
EXTERN int global_var;
your_source.c
//your source makes definition for global_var
#define YOUR_SOURCE
#include <public_header.h>
other_source.c
#include <public_header.h> //other sources make declaration for global_var
如果您希望它是私有的(内部链接),我认为最好的解决方案是在源文件而不是头文件中定义它,以防止头文件被另一个源包含然后混淆。
your_souce.c
static int private_var;