【问题标题】:Is it bad practice to instantiate C struct object as global variable?将 C 结构对象实例化为全局变量是不好的做法吗?
【发布时间】:2015-02-06 17:09:27
【问题描述】:

这是一个示例代码,声明了结构 A,然后在 main 中定义了它的实例“instanceOfA”,因此它成为局部变量,并且要在其他函数中访问它,我应该将它作为参数传递。另一方面,struct B 被声明并且它的实例被定义为全局变量,它允许我在任何需要它的地方使用“instanceOfB”,而不是直接将它作为参数传递。我现在唯一应该担心的是某些函数可能会覆盖“instanceOfA”标识符,对吗?因为它的变量(a,b,c)已经在它自己的“命名空间”中。那么将结构对象定义为全局变量是一种不好的做法吗?你会怎么办? 对不起我的英语不好。

struct A {
    int a,b,c;
};
struct B {
    int a,b,c;
} instanceOfB;

int main(void) {

    struct A instanceOfA;
    instanceOfA.a = 5;

    instanceOfB.a = 10;

}

【问题讨论】:

  • C 没有命名空间。 C++ 做
  • 对。我的意思是全局变量和局部变量。我会编辑那个。谢谢。
  • 旁注:标题中的define不恰当;请改用declareinstantiate
  • 作为一般准则,尽可能避免全局空间中的对象。
  • 每种语言都有命名空间。大多数只是很少,并且没有对它们提供太多控制。

标签: c struct declaration


【解决方案1】:

我不确定这个问题到底是什么,但这里有一些想法。

instanceOfB 是一个全局变量,对吧?所以,它是一个evil that should be avoided if not strictly necessary

相反,函数体内部的struct A instanceOfA; 对我来说看起来不错,尽管我们通常通过using typedef struct idiom 将类型从struct 命名空间移动到全局命名空间以减少打字。

【讨论】:

  • 感谢有用的链接。问题是关于“作为全局变量的结构:好还是坏?”而且我知道“全局变量”通常被认为是坏事。我只是希望结构可能有一些例外。我只是在查看我的旧代码,其中有很多作为参数传递的结构,并且几乎到处都需要其中的几个结构,所以我想也许我应该将它们设为全局。
【解决方案2】:

是的,确实,将 anything 定义为全局变量,而不仅仅是结构体,这是非常糟糕的做法。

是的,您需要将其作为参数传递。这实际上很好,还不错。

这意味着程序中的每一段单独的代码(函数)都只能修改它要修改的内容,而不能随意修改。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-24
    • 2019-08-26
    • 2012-05-18
    • 1970-01-01
    • 2011-08-13
    • 2013-08-26
    • 2011-02-15
    相关资源
    最近更新 更多