我在哪里可以在c程序中声明全局变量,无论是在头文件还是源文件中

Where can I declare global variable in c program , whether in header or source file

本问题已经有最佳答案,请猛点这里访问。

嗨,我是一个C++开发者,现在我正在做C编程。

我的问题是,在C程序中,哪个地方更好地声明全局变量。头文件或源文件(如果我的全局变量未在其他文件中使用)?

我希望这个变量像C++中的私有变量一样。


不应将全局非常量变量放在任何位置。与extern中声明的全球,可用于整个项目。这样做的必要性总是源于糟糕的程序设计,周期。这对于C和C++都是正确的。

例外情况是const变量,可以跨多个文件共享。

在需要文件范围变量的情况下,它们应该在.c文件中声明,并且始终作为static。不要将它们与"globals"混淆,因为它们是声明它们的翻译单元的本地部分。更多关于static文件范围变量如何有意义的信息。

还要注意C标准未来语言方向:

Declaring an identifier with internal linkage at file scope without
the static storage class specifier is an obsolescent feature.

因此,如果不使用static,您的代码可能无法在C标准的下一个版本中编译。


假设您的变量是全局变量和非静态变量。

您需要在头文件中声明它。我们对此使用extern关键字。正如注释中指出的,这个关键字是不必要的,但是大多数C用户更喜欢在头中使用它,这是一个惯例。

堆栈溢出.h:

1
2
3
4
5
6
#ifndef STACHOVERFLOW_H
#define STACHOVERFLOW_H

extern int my_var;

#ifndef

然后在源文件中初始化它。(如果要提供初始化值,则禁止使用关键字extern)。

栈溢出

1
2
3
#include"stackoverflow.h"

int my_var = 50;

不要将初始化值放在头中,否则如果头至少使用两次,则会出现链接器错误。

现在您可以在任何其他模块中使用您的变量,方法是包含头部。

主C

1
2
3
4
5
6
7
8
9
#include <stdio.h>
#include"stackoverflow.h"

int main()
{
    printf("my_var = %d
"
, my_var);
    return 0;
}

在"stackoverflow.c"中包含头"stackoverflow.h"是一种确保源文件中的定义与头文件中的声明匹配的方法。这允许在编译时立即出现错误,而不是有时出现神秘的链接器错误。

编辑:这根本不是使变量"私有"的方法。必须使用静态变量使其成为"私有"。见R sahu的答案


在C程序中,哪个地方更适合声明全局变量

答:在源文件(*.c)中。

假设场景类似,我在头文件中声明了一个变量。我把这个头包含在两个不同的.c文件中。在编译的宏扩展步骤之后,这两个文件将具有相同名称的全局变量。因此,它将在链接期间抛出一个错误,比如变量的多个声明。

结论:

将所有全局变量声明保存在.c文件中,如果在其他文件中不需要,则将其作为static

如果需要从其他文件访问,在相应的头文件中添加该变量的extern声明。


如果您打算在多个.c文件中使用全局变量,最好在.h文件中声明它们。但是,如果希望保持变量如EDCOX1×7的C++类中的成员数据,最好通过函数提供对全局数据的访问。

而不是

1
extern int foo;

使用

1
2
int getFoo();
void setFoo(int);

这种类型模仿类的成员变量的private访问说明符。


如果您希望它是全局的(外部链接),您应该将它放在.h文件中。我认为这是最好的做法之一:

公共报头

1
2
3
4
5
6
7
#ifdef YOUR_SOURCE
 #define EXTERN
#else
 #define EXTERN extern
#endif

EXTERN int global_var;

YouSux.c

1
2
3
//your source makes definition for global_var
#define YOUR_SOURCE
#include <public_header.h>

其他来源

1
#include <public_header.h> //other sources make declaration for global_var

如果您希望它是私有的(内部链接),我认为最好的解决方案就是在源文件中正确地定义它,而不是在头文件中,以防止头文件被另一个源包含,然后使其混淆。

你的简历

1
static int private_var;


一般来说,您可以在源文件中定义变量,如int g_foo;,然后在具有extern的其他文件中引用这个全局变量,如extern int g_foo; do_sth(g_foo);。您可以将extern int g_foo;声明放在头文件中,并将其包含在其他源文件中。不建议在头文件中定义数据。