【问题标题】:Do you define global variables in a C library?您是否在 C 库中定义全局变量?
【发布时间】:2016-03-30 16:20:39
【问题描述】:

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

【问题讨论】:

标签: c global-variables static-libraries


【解决方案1】:

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

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

换句话说,标题应该说

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        应该没有问题,也可以在.c中声明,在.h文件中使用extern

        【讨论】:

        • 查看标签!这是关于 C,而不是 C++。
        • 对不起,我只是用 c++ 编码,这就是为什么我写 cpp 而不是 c,这不是投反对票的理由
        • 嗯,是的。因为像 gcc 这样的典型编译器前端将调用 C++ 编译器。在编译 C 代码时,这是一种不同的语言和一个非常糟糕的主意。但这不仅仅是为了这个。您的建议是错误的(请了解 declarationdefinition 之间的区别以及 extern 说明符的含义。顺便说一句。这在 C++ 中是相似的。请参阅 cmets 和其他答案。
        【解决方案5】:

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

        【讨论】:

        • 我希望您的意思是“___ 这样做是个坏习惯”。
        • 不,我的意思是,C 中有很多方法可以用于 evreything,但是您必须遵循一些标准,以便其他人可以轻松理解您的代码,就是这样 ^_^
        猜你喜欢
        • 2015-09-27
        • 1970-01-01
        • 1970-01-01
        • 2018-06-03
        • 2022-07-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多