以 .(点)需要解释

Struct variable name prefixed with a .(dot) need explaination

本文关键字:解释      更新时间:2023-10-16

这是 GitHub 下 OBS Studio 的代码摘录。我未能理解以下内容:

1) struct 关键字后跟结构名称 (obs_encoder_info) 和标签 (opus_encoder_info) 吗?

2) 结构变量如何以 .(点) ?它是另一个结构的成员变量吗?

struct obs_encoder_info opus_encoder_info = {
.id             = "ffmpeg_opus",
.type           = OBS_ENCODER_AUDIO,
.codec          = "opus",
.get_name       = opus_getname,
.create         = opus_create,
.destroy        = enc_destroy
};

这是指定的初始值设定项(自 C++20 起)。

因此,它声明一个名为opus_encoder_info的对象,类型为obs_encoder_info,其数据成员id用值"ffmpeg_opus"初始化,type用值OBS_ENCODER_AUDIO初始化,依此类推。

1)

struct 关键字后跟结构名称 (obs_encoder_info) 和标签 (opus_encoder_info) 吗?

几乎。struct关键字后跟结构名称,但之后是变量(不是标记)名称。此行声明(并初始化)opus_encoder_info作为类型为struct obs_encoder_info的变量。(在C++中,struct关键字不是必需的,但在 C 中是必需的。

2) 结构变量如何以 .(点) ?它是另一个结构的成员变量吗?

您的术语在这里有点不对劲,因为结构变量是opus_encoder_info的,而以点为前缀的东西是结构成员。无论如何,一个struct obs_encoder_info显然有名为idtype等的成员,并且opus_encoder_info变量的这些字段是通过指示符的初始化来初始化的,这是C99的新功能。(简而言之,成员x通过在大括号内写入.x = a来初始化为值a

是的,我的回答好像代码是用 C 编写的,即使这个问题被标记为"C++"。我证明这一点是因为我有理由相信有问题的代码是C。首先,在声明变量时使用struct关键字 – 在 C 中是必需的,但在C++中是多余的。其次,代码来自扩展名为".c"而不是"的文件。C"(大写)或".cpp"或任何其他表示C++源文件的扩展名。第三,这种代码在 2014 年的文件中就存在(2017 年有过一次名称更改),使用 C++20 功能还为时过早,更不用说在生产代码中使用了。

所以我得出的结论是,这个问题被错误地标记了。但是,答案(以及可接受的答案)的存在意味着修复问题的标签可能会导致比解决的更多的混乱。