我搜索了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_date
和build_version
值。
这曾经在C中工作,但我无法弄清楚为什么它在C ++中不起作用。
有什么想法吗?
修改:
我意识到这段代码看起来像简单的C,实际上它就是。整个项目都是用C ++编写的,所以我必须使用C ++文件扩展来防止makefile依赖混乱(%.o: %.cpp
)
答案 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 ++的标准功能。
但是,有些编译器可能会将其作为非标准语言扩展提供。