gpt4 book ai didi

c - 如何定义和声明库代码使用的全局变量?

转载 作者:太空宇宙 更新时间:2023-11-04 00:42:20 27 4
gpt4 key购买 nike

主文件(prog.c):

#include "log.c"
#include "library.c"
static char * Foo;

如果在主文件 (prog.c) 中定义了某个变量 (char * Foo),并且从 library.c 调用的 log.c 函数需要它,如何正确声明 Foo 在 log.c 的命名空间中可见?

最佳答案

将其声明添加到包含在两个 .c 文件中的某个 .h 文件中。在其中一个文件中定义它。

当然,不能将其声明为 static 才能使其正常工作,因为 static 关键字保证在特定范围之外不需要该名称模块。

例如,在prog.h中:

extern char *Foo;

prog.c 中:

#include "prog.h"
#include "log.c"
#include "library.c"

char * Foo; // make sure that Foo has a definition

// some code probably wants to make Foo have a value other than NULL

log.c 中:

//... other includes
#include "prog.h" // and now Foo is a known name

// some code here is using the global variable Foo

现在,坏消息来了。

做这种事情会在 prog.clog.c 模块之间建立耦合。这种耦合会增加整个应用程序的维护成本。原因之一是没有办法阻止其他模块也使用全局变量。更糟糕的是,他们可能完全是无意中使用它,因为它的名称没有足够的描述性。

更糟糕的是,全局变量使得从单线程程序转移到多线程程序变得更加困难。可能从多个线程访问的每个全局变量都是真正难以诊断错误的潜在来源。解决方法是使用同步对象保护必须全局的信息,但过度使用会导致应用程序阻塞所有线程,当前正在使用全局的线程除外,从而使多线程应用程序有效地成为单线程。

当然,有时全局变量隐含的模块间耦合是可以接受的。一个用例是用于通用应用程序范围的选项。例如,如果您的应用程序支持一个 --verbose 选项,该选项使其在工作时会喋喋不休,那么由该选项设置并在整个代码中测试的标志将是一个全局变量是有意义的.

在 SO 中肯定有一些问题深入探讨了全局变量的陷阱,并将提供有关如何合理使用它们的指导。

关于c - 如何定义和声明库代码使用的全局变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3689435/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com