【问题标题】:Structure initialization in C++C++ 中的结构初始化
【发布时间】:2016-02-10 07:05:28
【问题描述】:

代码来自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++ 了解不多。因此,如果有任何链接或资源来理解这件事,我们将不胜感激。我通过谷歌搜索找不到太多。

【问题讨论】:

标签: c++ data-structures


【解决方案1】:

这是一个特定于编译器的扩展,是一种过时的指定初始化程序。 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++,它是不可移植的,但你可以使用 C99 语法,只要你使用的是 g++ 或与之兼容的 clang 之类的编译器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-21
    • 1970-01-01
    • 2012-07-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多