【发布时间】:2011-08-13 00:42:11
【问题描述】:
我已经在 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)
【问题讨论】:
-
为什么会这样?它适用于 C! 主要是因为 C 和 C++ 是不同的语言。
-
@David - 但有足够多的共同点,一个源于另一个,并且不断分享想法,因此对混乱感到压力是不公平的。 C99 的某些部分已经导入到 C++0x 中,例如“long long”。
-
@Steve314:不要误会我的意思,我并没有因为混乱而感到压力(我根本没有压力),但问题中没有混乱:他知道他们是不同的语言!当人们说因为一个特性在 C 中工作它必须 在 C++ 中工作时,我觉得很有趣。考虑一下这个,或者
void f( int x ) { int array[x]; ...}它们是不同的语言,虽然它们有着共同的过去,但它们并不总是共享未来。 -
我明白你的意思,我完全理解它们是不同语言的事实。事情是,我虽然这个微不足道的东西也可以在 C++ 中实现。据我所知,这是设置静态结构的一种非常优雅的方式。另一方面,我也同意这不是一种非常“C++”的使用结构的方式:我应该有一个构造函数。
标签: c++ static tags struct initialization