【发布时间】:2011-01-25 17:56:50
【问题描述】:
我又回到了 c/Linux。这个问题可能看起来很愚蠢,但在使用 c# 等工作后是相关的。
我在结构内部有一些结构,并且层次结构级别超过 5。在这种情况下,我在开始时明确地对每个结构进行初始化。我知道 c 没有一个 new() 方法可以为你做这件事。现在我想知道是否有任何工具/小部件可以为我创建启动结构的代码。这是一项乏味的工作,可以加快我的工作速度。
【问题讨论】:
标签: c linux automation struct
我又回到了 c/Linux。这个问题可能看起来很愚蠢,但在使用 c# 等工作后是相关的。
我在结构内部有一些结构,并且层次结构级别超过 5。在这种情况下,我在开始时明确地对每个结构进行初始化。我知道 c 没有一个 new() 方法可以为你做这件事。现在我想知道是否有任何工具/小部件可以为我创建启动结构的代码。这是一项乏味的工作,可以加快我的工作速度。
【问题讨论】:
标签: c linux automation struct
如果您只想将所有内容初始化为零,则可以使用{0} 初始化您的struct,这总是会将所有内容初始化为0。
来自 C 标准,6.7.8(强调我的):
20。如果聚合或联合包含属于聚合或联合的元素或成员,则这些规则递归地应用到子聚合或包含的联合。如果子聚合或包含联合的初始化程序以左大括号开头,则由该大括号及其匹配的右大括号包围的初始化程序初始化子聚合或包含联合的元素或成员。否则,仅从列表中获取足够多的初始化器来考虑子聚合的元素或成员或包含的联合的第一个成员;剩下的任何初始化器都将用于初始化当前子聚合或包含的联合所属的聚合的下一个元素或成员。
21。如果大括号括起来的列表中的初始值设定项少于聚合的元素或成员,或者用于初始化已知大小数组的字符串文字中的字符少于数组中的元素,则聚合的其余部分应隐式初始化与具有静态存储持续时间的对象相同。
简单来说,{0} 是任何聚合类型的正确初始化器。因此,struct foo bar = { 0 }; 将bar 的第一个元素初始化为0,其余元素递归地初始化为各自的零值。
如果您想将成员初始化为非零值,您可能需要编写一个函数。请注意,“零”值对于每种数据类型都是正确的。对于指针和/或浮点值,这可能不是全位为零。
gcc 和 -Wall 选项默认情况下会在您没有“足够”的大括号时发出警告,但如果您知道自己在做什么,则警告是无害的。您可以使用 -Wno-missing-braces 禁用
【讨论】:
您可以使用 calloc 函数将所有内存初始化为零。
calloc() 为一个 大小字节的 nmemb 元素数组 每个并返回一个指向 分配的内存。内存已设置 归零。
【讨论】: