C ++中的结构初始化

时间:2016-02-10 07:05:28

标签: c++ data-structures

代码从Android AOSP代码中窃取 ,Sensor.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 ++知之甚少。所以如果有任何链接或资源来理解这件事情将不胜感激。通过谷歌搜索我找不到多少。

1 个答案:

答案 0 :(得分:12)

它是特定于编译器的扩展,是指定初始化程序的过时形式。 gcc实现记录在here

在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,.name = value表单是有效且可移植的,只要您的编译器支持C99或更高版本。对于C ++,它不可移植,但只要您使用g ++或类似于它的clang编译器就可以使用C99语法。