【发布时间】:2016-03-30 16:20:39
【问题描述】:
目前我在main() 上方定义了子例程和全局变量。我正在尝试用 C 创建一个库。我可以在头文件中声明全局变量吗?
【问题讨论】:
标签: c global-variables static-libraries
目前我在main() 上方定义了子例程和全局变量。我正在尝试用 C 创建一个库。我可以在头文件中声明全局变量吗?
【问题讨论】:
标签: c global-variables static-libraries
我可以在头文件中声明全局变量吗?
是的,您可以在头文件中声明全局变量。但是,这些必须是声明,而不是全局变量的定义。
换句话说,标题应该说
// This goes into the header
extern int my_global_int;
C 文件应该说
int my_global_int;
注意:您可以这样做并不意味着您应该这样做。从库中公开“原始”全局变量是一种不好的做法,因为库的用户可能会对他们做出意想不到的事情。
更好的方法是通过将全局变量设为 static 来隐藏全局变量,并公开函数来操作它们:
// This goes into the header
int get_global();
void set_global(int n);
// This goes into the C file
static int my_former_global;
int get_global() {
return my_former_global;
}
void set_global(int n) {
if (<n-is-valid>) {
my_former_global = n;
}
}
【讨论】:
尽量减少使用全局变量,因为它们会降低程序的可读性并且更容易出错。一个库应该通过它的接口(在它提供的函数之间来回传递数据)来使用,而不是通过访问全局变量。
在确实没有其他方法的情况下,例如与中断服务例程共享数据,尝试通过将变量设置为静态来保持包含在该编译单元中的变量,这样它们就不会干扰其他库。
如果由于某种原因确实需要全局变量,请在代码文件(c文件)中定义,并在头文件中声明为extern。
【讨论】:
答案是肯定的和否定的。是的,您可以在头文件中声明全局变量,但不应该声明全局变量,尤其是当您要部署库时。或者至少谨慎选择要进入全局空间的变量,然后尝试重新考虑它们是否真的有用,或者在某些上下文结构中保存变量是否更好。
【讨论】:
应该没有问题,也可以在.c中声明,在.h文件中使用extern
【讨论】:
extern 说明符的含义。顺便说一句。这在 C++ 中是相似的。请参阅 cmets 和其他答案。
是的,你可以,但这是一个坏习惯;不要这样做。
【讨论】: