【问题标题】:Initialize a struct in C++ the C way以 C 方式初始化 C++ 中的结构
【发布时间】:2020-08-01 13:36:06
【问题描述】:

我像这样在 C 中初始化一个静态结构,但在 C++ 中它不想编译。如何在 C++ 中获得仍然与 C 兼容的等价物? (我试图在 MSVC 上编译的 linux C 代码)

typedef struct float3 {
    float x,y,z;
} float3;

void main() {
    static float3 value = (float3){ 1.f, 5.f, 10.f };
}

MSVC (visual studio 2019) 在 (float3) 之后的左括号“{”处给出错误。

Error (active)  E0029   expected an expression  cpptestvs   D:\Projects\cpptestvs\cpptestvs\cpptestvs.cpp   11  

【问题讨论】:

  • static float3 value = { 1.f, 5.f, 10.f };
  • 指定初始化器可以正常工作时,不需要复合文字语法。
  • OT: about: void main() 虽然有些编译器允许 main() 使用其他签名,但根据 c 标准只有两个有效签名:int main( void )int main( int argc, char *agrv[] )

标签: c++ c struct static init


【解决方案1】:

尝试在 void main() 中包含的语句中删除对 float3 的强制转换。

【讨论】:

    【解决方案2】:
    static float3 value = (float3){ 1.f, 5.f, 10.f };
    

    这是一个compound literal,在 C 语言中是允许的,但在 C++ 中是不允许的。 C 允许您创建 float3 类型的未命名对象并使用初始化列表对其进行初始化。一些编译器,例如 GCC,确实支持它作为扩展,但 MSVC 不支持。

    做你想做的事:

    static float3 value = { 1.f, 5.f, 10.f };
    

    这是aggregate initialisation:结构float3 中的每个非静态类成员都是从初始化列表的相应子句复制初始化的。您的结构是一个聚合,因为它没有用户声明的构造函数,没有私有或受保护的非静态数据成员,没有基类,也没有虚函数。

    【讨论】:

      猜你喜欢
      • 2016-08-26
      • 2011-09-05
      • 1970-01-01
      • 2012-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多