您是否在C库中定义全局变量?

时间:2016-03-30 16:20:40

标签: c global-variables static-libraries

目前我在main()上方定义了子程序和全局变量。我试图在C中创建一个库。我可以在头文件中声明全局变量吗?

5 个答案:

答案 0 :(得分:9)

  

我可以在头文件中声明全局变量吗?

是的,您可以在头文件中声明全局变量。但是,这些必须是声明,而不是全局变量的定义。

换句话说,标题应该说

// 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;
    }
}

答案 1 :(得分:1)

尽量减少全局变量的使用,因为它们会降低程序的可读性并且更容易出错。应该通过其接口使用库(在它提供的函数之间来回传递数据),而不是通过访问全局变量。

在没有其他办法的情况下,例如与中断服务程序共享数据,尝试通过使变量保持静态来保持包含在该编译单元中的变量,这样它们就不会干扰其他库。

如果由于某种原因你确实需要一个全局变量,请在代码文件(c文件)中定义它并在头文件中将其声明为extern。

答案 2 :(得分:0)

答案是肯定的,不是。是的,您可以在头文件中声明全局变量,但是不应该声明全局变量,尤其是当您要部署库时。或者至少选择那些非常谨慎地转向全局空间的变量,然后尝试重新思考它们是否真的有用,或者如果在某些上下文结构中保存变量会更好。

答案 3 :(得分:0)

应该没有问题,或者您可以在.c中声明它们并在.h文件中使用extern

答案 4 :(得分:0)

是的,你可以,但这是一个坏习惯;不要这样做。