当前位置:  开发笔记 > 编程语言 > 正文

在C++代码中初始化C结构

如何解决《在C++代码中初始化C结构》经验,为你挑选了2个好方法。

有没有更好的方法来初始化C++代码中的C结构?

我可以在变量声明点使用初始化列表; 但是,如果在编译时不知道所有参数,或者如果我没有声明本地/全局实例,那么这没有用,例如:

遗留C代码,它声明了结构,并且还使用了API

typedef struct
{
    int x, y, z;
} MyStruct;

使用C库的C++代码

void doSomething(std::vector &items)
{
    items.push_back(MyStruct(5,rand()%100,items.size()));//doesn't work because there is no such constructor
    items.push_back({5,rand()%100,items.size()});//not allowed either

    //works, but much more to write...
    MyStruct v;
    v.x = 5;
    v.y = rand()%100;
    v.z = items.size();
    items.push_back(v);
}

创建本地实例然后一次设置一个成员(myStruct.x = 5;等)是一个真正的痛苦,当尝试将20个不同的项添加到容器时有点难以阅读...



1> Christoph..:

你正在寻找C99复合文字.示例代码:

struct foo *foo = malloc(sizeof *foo);
*foo = (struct foo){ bar, baz };


这次,它实际上不是编译器的错,因为复合文字是C++不支持的C99特性; 我误解了你的问题,并认为你正在寻找C语言的解决方案......

2> AProgrammer..:

如果你不能添加一个构造函数(这是C++ 03中的最佳解决方案,但你可能与C有兼容性约束),你可以编写一个具有相同效果的函数:

MyStruct makeAMyStruct(int x, int y, int z)
{
    MyStruct result = { x, y, z };
    return result;
}

items.push_back(makeAMyStruct(5,rand()%100,items.size()));

编辑:我现在已经检查过C++ 0X为这个精确的问题提供了一些东西:

items.push_back(MyStruct{5,rand()%100,items.size()});

这是以g ++ 4.4提供的.

推荐阅读
大大炮
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有