这是来自OBS Studio under GitHub的代码的一部分。我无法理解以下内容:
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
};
答案 0 :(得分:3)
这是designated initializers(自C ++ 20起)。
因此,它声明了一个类型为{{1}的名为opus_encoder_info
的对象,并且其数据成员obs_encoder_info
的初始化为值id
,"ffmpeg_opus"
的初始化为value type
,依此类推。
答案 1 :(得分:1)
1)struct关键字后跟一个结构名称(obs_encoder_info)和一个标记(opus_encoder_info)吗?
差不多。 struct
关键字后跟一个结构名,但之后是一个变量(不是标签)名。该行将opus_encoder_info
声明(并初始化)为类型为struct obs_encoder_info
的变量。 (在C ++中,struct
关键字不是必需的,但在C中则是必需的。)
2)如何在结构变量前加上。(点)?它是另一个结构的成员变量吗?
您的术语在这里有点过头,因为struct变量是opus_encoder_info
,而带点前缀的东西是struct成员。无论如何,struct obs_encoder_info
显然具有名为id
,type
等的成员,并且opus_encoder_info
变量的那些字段是通过initialization by designators初始化的,这是C99的新功能。 (总而言之,成员x
通过在括号内写入a
来初始化为值.x = a
。)
是的,即使这个问题标记为“ C ++”,我的回答也好像代码是用C编写的。我有理由说,因为我有理由相信所讨论的代码是C。首先,在声明变量时使用了struct
关键字-C中是必需的,但在C ++中是多余的。其次,代码来自扩展名为“ .c”的文件,而不是“ .C”(大写)或“ .cpp”或任何其他表示C ++源文件的扩展名。第三,the file in 2014中存在这种代码(2017年进行了名称更改),使用C ++ 20功能还为时过早,而在生产代码中使用它的时间则少得多。
因此,我得出的结论是,这个问题的标签是错误的。但是,答案的存在(以及当时的可接受答案)意味着修复问题的标签比解决问题可能引起更多的混乱。