有没有更好的方法来初始化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个不同的项添加到容器时有点难以阅读...
你正在寻找C99复合文字.示例代码:
struct foo *foo = malloc(sizeof *foo); *foo = (struct foo){ bar, baz };
如果你不能添加一个构造函数(这是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提供的.