- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我想知道是否有人可以对以下两段代码之间的差异提供详细、简单的解释。给定以下定义:
typedef struct {
stuff;
stuff_2;
} variable_t;
有什么区别:
variable_t my_variable;
variable_t my_variable = {};
如果我执行第一个,然后从未完全初始化它,为什么编译器不会抛出错误?
注意:我正在使用 gcc -std=gnu99
进行编译,所以第二个是有效的并且最终成为我遇到的问题的解决方案。我想知道为什么。
最佳答案
这在一定程度上取决于您放置相应变量定义的位置,而且似乎还取决于所使用的编译器。
自动存储时长
让我们讨论变量具有自动存储持续时间时的区别(如果将它放在函数或 block 作用域中并且没有 static
关键字就是这种情况):
void someFunction() {
variable_t my_variable; // (1)
variable_t my_variable = {}; // (2)
}
(1) 表示没有显式初始化的变量定义。并根据这个 online C standard draft ,它的值是不确定的:
If an object that has automatic storage duration is not initialized explicitly, its value is indeterminate.
(2) 是一个变量定义,通过没有指示符的初始化列表进行显式初始化,即不通过名称将值与成员相关联,而仅通过值的顺序(参见 6.7.9 p17..21)。
有趣的段落是6.7.9 p21 , 它指出如果初始化列表的条目少于结构成员的数量,则根据静态存储持续时间的初始化规则(即 0
或 NULL
稍后解释):
If there are fewer initializers in a brace-enclosed list than there are elements or members of an aggregate, ... , the remainder of the aggregate shall be initialized implicitly the same as objects that have static storage duration.
所以看起来,如果您编写 variable_t my_variable = {}
,那么所有成员都被初始化为 0
或 NULL
。
但是,正如 aschepler 在评论中提到的那样,C initialization list grammar声明初始化列表不能为空(参见 cppreference.com ):
... the initializer must be a non-empty, brace-enclosed, comma-separated list of initializers for the members
所以根据标准,C 中的初始化列表至少需要一个条目;在我的 XCode8.3 环境中使用 -std=gnu99
测试它时,似乎支持一个空的初始化列表,但我知道这不是一个有效的引用。所以为了安全而不依赖于特定的编译器扩展,你实际上应该写:
variable_t my_variable = {0};
静态存储时长
在文件范围内,您的变量定义将具有静态存储持续时间,然后应用其他规则(参见 6.7.9 (10) ):
(10) ... If an object that has static or thread storage duration is not initialized explicitly, then:
- if it has pointer type, it is initialized to a null pointer;
- if it has arithmetic type, it is initialized to (positive or unsigned) zero;
- if it is an aggregate, every member is initialized (recursively) according to these rules, and any padding is initialized to zero bits;
- if it is a union, the first named member is initialized (recursively) according to these rules, and any padding is initialized to zero bits;
...
(21) If there are fewer initializers in a brace-enclosed list than there are elements or members of an aggregate, ... the remainder of the aggregate shall be initialized implicitly the same as objects that have static storage duration.
所以如果你写...
#include <stdio.h>
variable_t my_variable; // (1)
variable_t my_variable = {}; // (2)
那么 (1) 和 (2) 实际上会产生相同的结果,因为对于未显式初始化的变量 (1),段落 (10) 适用,而对于显式但为空的初始化变量 (2),根据段落 (21) ), 每个成员都退回到 (10) 的初始化规则。
同样,如上所述,编译器可能不支持空的初始化列表。
希望对您有所帮助(因为打了很多字:-))
关于有人可以解释这两个初始化程序之间的区别吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45019838/
我是 Spring 新手,这就是我想要做的事情: 我正在使用一个基于 Maven 的库,它有自己的 Spring 上下文和 Autowiring 字段。 它的bean配置文件是src/test/res
我在我的测试脚本中有以下列表初始化: newSequenceCore=["ls", "ns", "*", "cm", "*", "ov", "ov", "ov", "ov", "kd"] (代表要在控
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: Class construction with initial values 当我查看 http://en.
我得到了成员变量“objectCount”的限定错误。编译器还返回“ISO C++ 禁止非常量静态成员的类内初始化”。这是主类: #include #include "Tree.h" using n
我有如下所示的a.h class A { public: void doSomething()=0; }; 然后我有如下所示的b.h #include "a.h" class b: publi
我需要解析 Firebase DataSnapshot (一个 JSON 对象)转换成一个数据类,其属性包括 enum 和 list。所以我更喜欢通过传递 DataSnapshot 来手动解析它进入二
我使用 JQuery 一段时间了,我总是使用以下代码来初始化我的 javascript: $(document).ready( function() { // Initalisation logic
这里是 Objective-C 菜鸟。 为什么会这样: NSString *myString = [NSString alloc]; [myString initWithFormat:@"%f", s
我无法让核心数据支持的 NSArrayController 在我的代码中正常工作。下面是我的代码: pageArrayController = [[NSArrayController alloc] i
我对这一切都很陌生,并且无法将其安装到我的后端代码中。它去哪里?在我的页脚下面有我所有的 JS? 比如,这是什么意思: Popup initialization code should be exec
这可能是一个简单的问题,但是嘿,我是初学者。 所以我创建了一个程序来计算一些东西,它目前正在控制台中运行。我决定向其中添加一个用户界面,因此我使用 NetBeans IDE 中的内置功能创建了一个 J
我有 2 个 Controller ,TEST1Controller 和 TEST2Controller 在TEST2Controller中,我有一个initialize()函数设置属性值。 如果我尝
据我所知, dependentObservable 在声明时会进行计算。但如果某些值尚不存在怎么办? 例如: var viewModel ={}; var dependentObservable1 =
我正在阅读 POODR 这本书,它使用旧语法进行默认值初始化。我想用新语法实现相同的功能。 class Gear attr_reader :chainring, :cog, :wheel de
我按照 polymer 教程的说明进行操作: https://www.polymer-project.org/3.0/start/install-3-0 (我跳过了可选部分) 但是,在我执行命令“po
很抱歉问到一个非常新手的Kotlin问题,但是我正在努力理解与构造函数和初始化有关的一些东西。 我有这个类和构造函数: class TestCaseBuilder constructor(
假设我们有一个包含 30 列和 30 行的网格。 生命游戏规则简而言之: 一个小区有八个相邻小区 当一个细胞拥有三个存活的相邻细胞时,该细胞就会存活 如果一个细胞恰好有两个或三个活的相邻细胞,那么它就
我是 MQTT 和 Android 开放附件“AOA” 的新手。在阅读教程时,我意识到,在尝试写入 ByteArrayOutputStream 类型的变量之前,应该写入 0 或 0x00首先到该变量。
我有 2 个 Controller ,TEST1Controller 和 TEST2Controller 在TEST2Controller中,我有一个initialize()函数设置属性值。 如果我尝
我有一个inotify /内核问题。我正在使用“inotify” Python项目进行观察,但是,我的问题仍然是固有的关于inotify内核实现的核心。 Python inotify项目处理递归ino
我是一名优秀的程序员,十分优秀!