【问题标题】:Why we can't set a default value to a struct's member?为什么我们不能为结构的成员设置默认值?
【发布时间】:2020-08-12 06:44:15
【问题描述】:

我们知道结构体可以声明为:

struct correct {
    int year;
    int *p; 
};

但我们不能将其声明为:

struct wrong {
    int year = 2020;
    int *p; 
};

所以我的问题是:

Q1-为什么 C 设计不允许为结构的成员设置默认值?让我们程序员以后不用再初始化不是更方便吗?

Q2-对于正确的结构类型,yearp 是否都被 GCC 初始化为 0

【问题讨论】:

  • 第一个问题主要基于意见,因此不适合 Stack Overflow。对于第二个,它取决于声明该类型变量的方式/位置:What happens to a declared, uninitialized variable in C? Does it have a value?
  • @kaylum 这不是基于意见的。他们做出某种设计选择的原因是可以客观地回答的,前提是您知道答案,但很难找到。
  • 这是一篇关于 C 语言历史的有趣文章:bell-labs.com/usr/dmr/www/chist.html。一个核心问题是结构如何映射到内存。引用:“我希望该结构不仅可以表征抽象对象,还可以描述可能从目录中读取的位集合。” 成员初始化不太可能被视为核心问题,因为有其他初始化结构的方法。
  • 不过,您可以编写 struct foo { int year; int *p; } bar = {2020}; 并将 bar.year 初始化为 2020 并将 bar.p 初始化为 NULL,完全符合任何语言版本的标准。

标签: c


【解决方案1】:

首先回答Q2:初始化为0 只针对特定存储空间中的变量指定。函数内部的局部变量根本没有指定初始化。

解决了这个问题,这让我可以推测 Q1:为什么 C 语言的设计者会这样设计 C。

链接器可以将所有静态符号(编译单元的本地符号)和全局符号放入单个内存区域,在程序启动时可以轻松将其清零。这是一个非常简单的概念,涵盖了很多内容。

否则,您将需要按类型定义默认值。这可以作为包含要复制的默认值的原型内存区域或将一块内存设置为默认值的一段代码来完成。后者的概念存在,称为构造函数,并在编程语言 C++ 中实现。每次在某处定义某种类型的变量时,都需要复制默认值或调用构造函数的代码。

C 被设计为用于编写 Unix 操作系统的系统语言,我认为他们只是想避免编译器、链接器、运行时等方面的所有复杂性。如果您想要更高级的语言,您可以选择或发明另一种语言。即使回到 1970 年代初期,CPU 周期、内存和存储的限制也可能有利于不太复杂的代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-18
    • 1970-01-01
    • 1970-01-01
    • 2021-10-12
    • 2016-09-19
    • 2020-05-26
    • 2015-01-21
    • 1970-01-01
    相关资源
    最近更新 更多