本问题已经有最佳答案,请猛点这里访问。
嗨,我是一个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:
#ifndef STACHOVERFLOW_H
#define STACHOVERFLOW_H
extern int my_var;
#ifndef
然后在源文件中初始化它。(如果要提供初始化值,则禁止使用关键字extern)。
栈溢出
#include"stackoverflow.h"
int my_var = 50;
不要将初始化值放在头中,否则如果头至少使用两次,则会出现链接器错误。
现在您可以在任何其他模块中使用您的变量,方法是包含头部。
主C
#include
#include"stackoverflow.h"
int main()
{
printf("my_var = %d
", my_var);
return 0;
}
在"stackoverflow.c"中包含头"stackoverflow.h"是一种确保源文件中的定义与头文件中的声明匹配的方法。这允许在编译时立即出现错误,而不是有时出现神秘的链接器错误。
编辑:这根本不是使变量"私有"的方法。必须使用静态变量使其成为"私有"。见R sahu的答案
一旦我们在stackoverflow.c中包含stackoverflow.h。编译器会把所有的东西复制粘贴到stackoverflow.c中,对吗?那为什么要在外面呢?对不起,如果我的问题是愚蠢的
是的,你说得对。它指向我的答案,对吗?
抱歉,亲爱的@user3302647我没有得到答案。我的问题是有必要把extern int my_var放在stackoverflow.h中。
不,没有必要:)
@巴维,你同意我的回答吗?
@Bhavithcacharya更新了我的答案,使事情更清楚。
@用户3302647。是的,我同意你的回答。谢谢。我的理解是,如果我使用extern键,那么它也可以访问其他源,它将具有更新的值,对吗?
@我误解了这个问题。这根本不是使变量"私有"的方法。你应该接受R sahu的回答而不是我的。
我很同意你的回答谢谢
当全局变量源于有缺陷的程序设计时,需要声明非常量变量。你不应该这样做。但是,有些情况下,文件范围static变量是有意义的。这些不是全球性的。
在C程序中,哪个地方更适合声明全局变量
答:在源文件(*.c)中。
假设场景类似,我在头文件中声明了一个变量。我把这个头包含在两个不同的.c文件中。在编译的宏扩展步骤之后,这两个文件将具有相同名称的全局变量。因此,它将在链接期间抛出一个错误,比如变量的多个声明。
结论:
将所有全局变量声明保存在.c文件中,如果在其他文件中不需要,则将其作为static。
如果需要从其他文件访问,在相应的头文件中添加该变量的extern声明。
@用户332647 static变量在*.c或*.h中?
将其添加到*.c文件中
如果您打算在多个.c文件中使用全局变量,最好在.h文件中声明它们。但是,如果希望保持变量如EDCOX1×7的C++类中的成员数据,最好通过函数提供对全局数据的访问。
而不是
extern int foo;
使用
int getFoo();
void setFoo(int);
这种类型模仿类的成员变量的private访问说明符。
@萨胡。假设在header test.h中,我声明了一个变量extern int a' and modified the value ofa` in test.c。如果我尝试在test2.c中使用a,那么我的a将以修改后的值或新的a存储。
是的,当然。
如果您希望它是全局的(外部链接),您应该将它放在.h文件中。我认为这是最好的做法之一:
公共报头
#ifdef YOUR_SOURCE
#define EXTERN
#else
#define EXTERN extern
#endif
EXTERN int global_var;
YouSux.c
//your source makes definition for global_var
#define YOUR_SOURCE
#include
其他来源
#include //other sources make declaration for global_var
如果您希望它是私有的(内部链接),我认为最好的解决方案就是在源文件中正确地定义它,而不是在头文件中,以防止头文件被另一个源包含,然后使其混淆。
你的简历
static int private_var;
为什么它在source.c中应该是静态的?为什么不能是非静态的?有什么原因吗?。是因为将其设置为本地文件吗?
是的,就像我提到的,如果你想它是私有的(从其他来源的文件看不到),那么它需要与static一起使用。
一般来说,您可以在源文件中定义变量,如int g_foo;,然后在具有extern的其他文件中引用这个全局变量,如extern int g_foo; do_sth(g_foo);。您可以将extern int g_foo;声明放在头文件中,并将其包含在其他源文件中。不建议在头文件中定义数据。