gpt4 book ai didi

c - 外部变量

转载 作者:行者123 更新时间:2023-11-30 18:18:12 25 4
gpt4 key购买 nike

如何使用 header 中定义的变量,以及如何使用 extern 在多个源文件中使用它们。我收到多个定义错误。

最佳答案

要遵循的一个好规则是:“不要在头文件中定义内容”。 声明您想要的所有内容,但定义应仅限于非 header 。 声明只是某事物存在的通知。 定义实际上定义了它是什么。

该准则背后的基本原理是为了防止出现您所看到的情况 - 由于头文件包含在多个编译单元中,所以事物定义了两次(或更多)。

为了避免这种情况,您可以使用以下内容:

myprog.h:
extern int myVar; // a declaration.

myprog.c:
#include "myprog.h"
int myVar = 7; // a definition.

otherbit.c:
#include "myprog.h"
int fn (void) {
myVar = 12;
return myVar;
}

上面的定义只会在 myprog.o 中结束,您不会在 otherbit.o 中获得另一个副本,从而导致链接时出现问题。

抛开正确的封装会使这些全局变量成为一个非常糟糕的主意,这就是我这样做的方式。

封装的方式是这样的:

myprog.h:
int getMyVar (void);
void setMyVar (int);

myprog.c:
#include "myprog.h"
static int myVar = 7;
int getMyVar (void) { return myVar; }
void setMyVar (int n) {
// Error checks on n here.
myVar = n;
}

otherbit.c:
#include "myprog.h"
int fn (void) {
setMyVar (12);
return getMyVar();
}

封装基本上是信息隐藏。这意味着您应该尽可能少地暴露自己的内部工作来完成工作,以免您暴露其他代码潜入幕后的可能性,从而使您的假设无效(见下文)或者让以后更难改变你的内部运作方式。

一个典型的例子是,如果您希望将 myVar 变量限制在 0 到 359 的范围内(包括一个角度)。通过封装,您可以简单地使用:

void setMyVar (unsigned int n) { myVar = n % 360; }

并且永远不必担心它无效。您可以放心地假设,除了内存损坏之外,myVar 将始终在所需的范围内。如果一些流氓用户代码可能进入并执行以下操作,您将无法确定:

myVar = 32767;

在你不知情的情况下。您要么必须满足超出所需范围的值,要么在所有函数开始时强制其达到有效范围:

myVar = myVar % 360;

这是糟糕的编码习惯,而且完全没有必要。

关于c - 外部变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2910810/

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