如何在C++中初始化结构数组而不使用复合文字但仍在一行中

rsaldnfx  于 2023-02-10  发布在  其他
关注(0)|答案(1)|浏览(95)

下面的代码:

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++的方式可以做非常类似的事情。
我了解以下情况:

  1. 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.1this post中的方法,默认的C标准是C14。
eit6fx6z

eit6fx6z1#

去掉类型名称周围的括号就行了。你为什么需要它呢?

students[  0] = StudentStruct{"Alex",    78.9};

也可以在此上下文中完全删除类型名称:

students[  0] = {"Alex",    78.9};

相关问题