下面的代码:
struct StudentStruct {
char name[32];
float score;
};
它是这样初始化的:
StudentStruct students[1000];
for (size_t i = 1; i < sizeof(students) / sizeof(students[0]) - 5; ++i) {
Ops[i] = (StudentStruct){"Empty", 0.0};
}
students[ 0] = (StudentStruct){"Alex", 78.9};
// There will always be a huge gap, which could prevent some
// possible syntax to work
students[995] = (StudentStruct){"Bob", 3.14};
students[996] = (StudentStruct){"Charlie", 2.71};
students[997] = (StudentStruct){"David", 99.9};
students[998] = (StudentStruct){"Eugene", 0 };
students[999] = (StudentStruct){"Frank", -2.2};
// This is just an example, in reality I would need to manually define hundreds of them.
这在我启用-Wpedantic
之前一直很好用,warning: ISO C++ forbids compound-literals [-Wpedantic]
抱怨说。我想知道是否有一种符合ISO C++的方式可以做非常类似的事情。
我了解以下情况:
- brace initialization:但是玩了一段时间后,我觉得它似乎无法装入我的机箱。
1.将struct
更改为class
并准备一个构造函数:这应该可以工作,但是如果可能的话我更喜欢保留struct
,因为代码可能会被其他语言调用,简单的内存布局会让我感觉好一点。
你知道吗?
- 编辑:**
- 一些答案指向这一点:
students[0] = { "Alex", 78.9 };
我不知道为什么,它不工作与我的g ++,错误是:error: no match for ‘operator=’ (operand types are ‘StudentStruct’ and ‘<brace-enclosed initializer list>’)
- 我使用的是
g++ 10.2.1
和this post中的方法,默认的C标准是C14。
1条答案
按热度按时间eit6fx6z1#
去掉类型名称周围的括号就行了。你为什么需要它呢?
也可以在此上下文中完全删除类型名称: