C++中的结构初始化

Structure initialization in C++

本文关键字:初始化 结构 C++      更新时间:2023-10-16

从Android AOSP代码中截取的代码,传感器.cpp具有以下代码。

struct sensors_module_t HAL_MODULE_INFO_SYM = {
    common: {
        tag: HARDWARE_MODULE_TAG,
        version_major: 1,
        version_minor: 0,
        id: SENSORS_HARDWARE_MODULE_ID,
        name: "LGE Sensor module",
        author: "LG Electronics Inc.",
        methods: &sensors_module_methods,
        dso: NULL,
        reserved: {0}
    },
    get_sensors_list: sensors__get_sensors_list,
};

现在我不明白这里:这里是什么意思?是某种初始化还是其他什么?

我对C++了解不多,所以如果有任何链接或资源来理解这一点,将不胜感激。 通过谷歌搜索我找不到太多。

它是一个特定于编译器的扩展,是指定初始值设定项的过时形式。 此处记录了 gcc 实现。

在 C 语言中,您可能有:

struct point { int x, y; };
struct point p = { 10, 20 };

使用 ISO C99 中引入的指定初始值设定项功能,您可以将其编写为:

struct point { int x, y; };
struct point p = { .x = 10, .y = 20 };

但在 C99 之前,gcc 引入了一个类似的功能,但语法不同:

struct point { int x, y; };
struct point p = { x: 10, y: 20 };

gcc,或者更准确地说是 g++,在C++模式下也支持此功能,但C++尚未采用 C99 样式的指定初始值设定项。

gcc 手册说,这个特性的:版本自 1993 年发布的 gcc 2.5 以来已经过时了,所以绝对不应该在新代码中使用。

请注意,如果初始值恰好是一个小整数常量,如您的示例所示:

    version_major: 1,
    version_minor: 0,

它很容易与位字段的语法混淆。

对于 C,只要编译器支持 C99 或更高版本,.name = value 形式就是有效且可移植的。 对于C++,它不是可移植的,但只要您使用 g++ 或与之兼容的编译器(如 clang(,您就可以使用 C99 语法。