使用C ++中的标记进行静态结构初始化

时间:2011-04-26 12:45:28

标签: c++ static tags struct initialization

我搜索了stackoverflow以获得答案,但我无法获得相关内容。

我正在尝试通过指定标签来初始化具有初始值的静态结构实例,但是在编译时遇到错误:

src/version.cpp:10: error: expected primary-expression before ‘.’ token

以下是代码:

// h
typedef struct
{
    int lots_of_ints;
    /* ... lots of other members */
    const char *build_date;
    const char *build_version;
} infos;

错误的代码:

// C

static const char *version_date = VERSION_DATE;
static const char *version_rev  = VERSION_REVISION;

static const infos s_infos =
{
   .build_date    = version_date, // why is this wrong? it works in C!
   .build_version = version_rev
};

const infos *get_info()
{
    return &s_infos;
}

因此,基本思路是绕过“其他成员”初始化,仅设置相关的build_datebuild_version值。 这曾经在C中工作,但我无法弄清楚为什么它在C ++中不起作用。

有什么想法吗?

修改

我意识到这段代码看起来像简单的C,实际上它就是。整个项目都是用C ++编写的,所以我必须使用C ++文件扩展来防止makefile依赖混乱(%.o: %.cpp

3 个答案:

答案 0 :(得分:7)

您正在使用的功能是C99功能,并且您使用的是不支持它的C ++编译器。请记住,尽管C代码通常是有效的C ++代码,但C99代码并不总是如此。

答案 1 :(得分:5)

以下示例代码在我认为更加C ++的方式(不需要typedef)中定义了一个结构,并使用构造函数来解决您的问题:

#include <iostream>

#define VERSION_DATE "TODAY"
#define VERSION_REVISION "0.0.1a"

struct infos {
    int lots_of_ints;
    /* ... lots of other members */
    const char *build_date;
    const char *build_version;

    infos() : 
        build_date(VERSION_DATE), 
        build_version(VERSION_REVISION) 
    {} 
};

static const infos s_infos;

const infos *get_info()
{
    return &s_infos;
}

int main() {

    std::cout << get_info()->build_date << std::endl;
    std::cout << get_info()->build_version << std::endl;

    return 0;
}

答案 2 :(得分:4)

我相信这是作为C99中的一项功能添加的,但从未成为C ++的标准功能。

但是,有些编译器可能会将其作为非标准语言扩展提供。