C ++-不支持非平凡的指定初始化程序

2024-04-12 01:38

本文主要是介绍C ++-不支持非平凡的指定初始化程序,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

我的结构如下:

struct app_data
{int port;int ib_port;unsigned size;int tx_depth;int sockfd;char *servername;struct ib_connection local_connection;struct ib_connection *remote_connection;struct ibv_device *ib_dev;};

当我尝试这样初始化它时:

struct app_data data =
{.port = 18515,.ib_port = 1,.size = 65536,.tx_depth = 100,.sockfd = -1,.servername = NULL,.remote_connection = NULL,.ib_dev = NULL
};

我收到此错误:

sorry, unimplemented: non-trivial designated initializers not supported

我认为它要完全按照声明的顺序进行初始化,并且缺少local_connection。 我不需要初始化它,并且将其设置为NULL不起作用。

如果我将其更改为g ++,仍然会出现相同的错误:

struct app_data data =
{port : 18515,ib_port : 1,size : 65536,tx_depth : 100,sockfd : -1,servername : NULL,remote_connection : NULL,ib_dev : NULL
};

c++ initialization

Ivan asked 2020-01-20T01:42:29Z

6个解决方案

45 votes

初始化的顺序必须与声明的确切顺序相同。

typedef struct FOO
{int a;int b;int c;
}FOO;FOO foo   = {.a = 1, .b = 2}; // OK
FOO foo1  = {.a = 1};         // OK
FOO foo2  = {.b = 2, .a = 1}; // Error sorry, unimplemented: non-trivial designated initializers not supported
FOO foo3  = {.a = 1, .c = 2}; // Error sorry, unimplemented: non-trivial designated initializers not supported

我知道这意味着编译器不支持面向名称,乱序的成员初始化。

需要以老式的方式初始化结构。 为了清楚起见,我保留了变量名,但是我必须按顺序对其进行初始化,而不要跳过变量。

我可以停止对任何变量的初始化,但是无法初始化随之而来的变量。

Parallel Universe answered 2020-01-20T01:43:34Z

27 votes

这不适用于g ++。 本质上,您是在C ++中使用C构造。 几种解决方法。

1)删除“。” 并在初始化时将“ =”更改为“:”。

#include <iostream>using namespace std;
struct ib_connection{int x;};struct ibv_device{int y;};struct app_data
{int port;int ib_port;unsigned size;int tx_depth;int sockfd;char *servername;struct ib_connection local_connection;struct ib_connection *remote_connection;struct ibv_device *ib_dev;};int main()
{struct app_data data ={port : 18515,ib_port : 1,size : 65536,tx_depth : 100,sockfd : -1,servername : NULL,local_connection : {5},remote_connection : NULL,ib_dev : NULL};cout << "Hello World" << endl; return 0;
}

2)使用g ++ -X c。 (不推荐),或将此代码放在外部C中[免责声明,我尚未对此进行测试]

Anon answered 2020-01-20T01:43:00Z

10 votes

我注意到我的GCC编译器有一些技巧可以接受.fieldname = value分配,但仅当字段以在结构体中声明的顺序出现时才进行编译。

我可以通过两种方式初始化此结构。 如果稍后更改结构字段顺序,则带有名称的名称将提高可读性并降低分配错误数据的风险。

//Declare struct
typedef struct
{uint32_t const * p_start_addr;uint32_t const * p_end_addr;fs_cb_t  const   callback;    uint8_t  const   num_pages;  uint8_t  const   priority;
} fs_config_t;//Assign unnamed
fs_config_t fs_config  
{(uint32_t*)0x00030000,  // uint32_t const * p_start_addr;(uint32_t*)0x00038000,  // uint32_t const * p_end_addr;         fs_evt_handler,         // fs_cb_t  const   callback;8,                      // uint8_t  const   num_pages;0xFE                    // uint8_t  const   priority;               
};//Assign to named fields
static fs_config_t fs_config1  
{.p_start_addr = (uint32_t*)0x00030000,.p_end_addr = (uint32_t*)0x00038000,            .callback = fs_evt_handler,.num_pages = 8,.priority = 0xFE                
};      

经验法则是:

  1. 分配给.name = value字段
  2. 按照声明的顺序分配
  3. 在作业中包括所有字段

flodis answered 2020-01-20T01:44:16Z

4 votes

由于Arduino IDE都不适合我使用其他方法,因此我决定简单地分别设置每个字段:

struct app_data data;data.port = 18515;
data.ib_port = 1;
data.size = 65536;
data.tx_depth = 100;
data.sockfd = -1;
data.servername = NULL;
data.remote_connection = NULL;
data.ib_dev = NULL;

Falko answered 2020-01-20T01:44:36Z

2 votes

不幸的是,C ++不支持指定的初始化程序。 GCC仍然允许您使用它们(作为扩展),但是必须按照struct中列出的顺序初始化成员。

另一个解决方法是使用立即调用的lambda:

constexpr fuse_operations fuse_ops = []{fuse_operations ops{};ops.destroy = wiifs_destroy;ops.getattr = wiifs_getattr;ops.access = wiifs_access;// ...return ops;
}();

我个人更喜欢此解决方案,因为它是完全标准的C ++,它使您可以按需要的顺序初始化字段,跳过不需要的字段并默认初始化其余的字段。 并且编译器仍然能够对此进行优化。 请注意,这仅适用于C ++ 17或更高版本。

Léo Lam answered 2020-01-20T01:45:05Z

-1 votes

还请注意,正如原始问题所述,成员表达式的顺序很重要。 我注意到,如果我只想在前面的示例中初始化“ size”,则需要在.port和.ib_port之前放置表达式。 否则会出现错误“对不起,未实现:不支持非平凡的指定初始值设定项”不是那么直观...

Guz answered 2020-01-20T01:45:26Z

translate from https://stackoverflow.com:/questions/31215971/non-trivial-designated-initializers-not-supported

C ++-不支持非平凡的指定初始化程序 - ITranslater

这篇关于C ++-不支持非平凡的指定初始化程序的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/895752

相关文章

Python程序打包exe,单文件和多文件方式

《Python程序打包exe,单文件和多文件方式》:本文主要介绍Python程序打包exe,单文件和多文件方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录python 脚本打成exe文件安装Pyinstaller准备一个ico图标打包方式一(适用于文件较少的程

python如何生成指定文件大小

《python如何生成指定文件大小》:本文主要介绍python如何生成指定文件大小的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录python生成指定文件大小方法一(速度最快)方法二(中等速度)方法三(生成可读文本文件–较慢)方法四(使用内存映射高效生成

Python程序的文件头部声明小结

《Python程序的文件头部声明小结》在Python文件的顶部声明编码通常是必须的,尤其是在处理非ASCII字符时,下面就来介绍一下两种头部文件声明,具有一定的参考价值,感兴趣的可以了解一下... 目录一、# coding=utf-8二、#!/usr/bin/env python三、运行Python程序四、

无法启动此程序因为计算机丢失api-ms-win-core-path-l1-1-0.dll修复方案

《无法启动此程序因为计算机丢失api-ms-win-core-path-l1-1-0.dll修复方案》:本文主要介绍了无法启动此程序,详细内容请阅读本文,希望能对你有所帮助... 在计算机使用过程中,我们经常会遇到一些错误提示,其中之一就是"api-ms-win-core-path-l1-1-0.dll丢失

SpringBoot后端实现小程序微信登录功能实现

《SpringBoot后端实现小程序微信登录功能实现》微信小程序登录是开发者通过微信提供的身份验证机制,获取用户唯一标识(openid)和会话密钥(session_key)的过程,这篇文章给大家介绍S... 目录SpringBoot实现微信小程序登录简介SpringBoot后端实现微信登录SpringBoo

uniapp小程序中实现无缝衔接滚动效果代码示例

《uniapp小程序中实现无缝衔接滚动效果代码示例》:本文主要介绍uniapp小程序中实现无缝衔接滚动效果的相关资料,该方法可以实现滚动内容中字的不同的颜色更改,并且可以根据需要进行艺术化更改和自... 组件滚动通知只能实现简单的滚动效果,不能实现滚动内容中的字进行不同颜色的更改,下面实现一个无缝衔接的滚动

python如何下载网络文件到本地指定文件夹

《python如何下载网络文件到本地指定文件夹》这篇文章主要为大家详细介绍了python如何实现下载网络文件到本地指定文件夹,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下...  在python中下载文件到本地指定文件夹可以通过以下步骤实现,使用requests库处理HTTP请求,并结合o

C++类和对象之初始化列表的使用方式

《C++类和对象之初始化列表的使用方式》:本文主要介绍C++类和对象之初始化列表的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C++初始化列表详解:性能优化与正确实践什么是初始化列表?初始化列表的三大核心作用1. 性能优化:避免不必要的赋值操作2. 强

Java使用WebView实现桌面程序的技术指南

《Java使用WebView实现桌面程序的技术指南》在现代软件开发中,许多应用需要在桌面程序中嵌入Web页面,例如,你可能需要在Java桌面应用中嵌入一部分Web前端,或者加载一个HTML5界面以增强... 目录1、简述2、WebView 特点3、搭建 WebView 示例3.1 添加 JavaFX 依赖3

防止SpringBoot程序崩溃的几种方式汇总

《防止SpringBoot程序崩溃的几种方式汇总》本文总结了8种防止SpringBoot程序崩溃的方法,包括全局异常处理、try-catch、断路器、资源限制、监控、优雅停机、健康检查和数据库连接池配... 目录1. 全局异常处理2. 使用 try-catch 捕获异常3. 使用断路器4. 设置最大内存和线