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

相关文章

SpringKafka消息发布之KafkaTemplate与事务支持功能

《SpringKafka消息发布之KafkaTemplate与事务支持功能》通过本文介绍的基本用法、序列化选项、事务支持、错误处理和性能优化技术,开发者可以构建高效可靠的Kafka消息发布系统,事务支... 目录引言一、KafkaTemplate基础二、消息序列化三、事务支持机制四、错误处理与重试五、性能优

使用Python实现获取网页指定内容

《使用Python实现获取网页指定内容》在当今互联网时代,网页数据抓取是一项非常重要的技能,本文将带你从零开始学习如何使用Python获取网页中的指定内容,希望对大家有所帮助... 目录引言1. 网页抓取的基本概念2. python中的网页抓取库3. 安装必要的库4. 发送HTTP请求并获取网页内容5. 解

Python实现合并与拆分多个PDF文档中的指定页

《Python实现合并与拆分多个PDF文档中的指定页》这篇文章主要为大家详细介绍了如何使用Python实现将多个PDF文档中的指定页合并生成新的PDF以及拆分PDF,感兴趣的小伙伴可以参考一下... 安装所需要的库pip install PyPDF2 -i https://pypi.tuna.tsingh

Spring组件初始化扩展点BeanPostProcessor的作用详解

《Spring组件初始化扩展点BeanPostProcessor的作用详解》本文通过实战案例和常见应用场景详细介绍了BeanPostProcessor的使用,并强调了其在Spring扩展中的重要性,感... 目录一、概述二、BeanPostProcessor的作用三、核心方法解析1、postProcessB

如何用java对接微信小程序下单后的发货接口

《如何用java对接微信小程序下单后的发货接口》:本文主要介绍在微信小程序后台实现发货通知的步骤,包括获取Access_token、使用RestTemplate调用发货接口、处理AccessTok... 目录配置参数 调用代码获取Access_token调用发货的接口类注意点总结配置参数 首先需要获取Ac

Flask解决指定端口无法生效问题

《Flask解决指定端口无法生效问题》文章讲述了在使用PyCharm开发Flask应用时,启动地址与手动指定的IP端口不一致的问题,通过修改PyCharm的运行配置,将Flask项目的运行模式从Fla... 目录android问题重现解决方案问题重现手动指定的IP端口是app.run(host='0.0.

一文教你解决Python不支持中文路径的问题

《一文教你解决Python不支持中文路径的问题》Python是一种广泛使用的高级编程语言,然而在处理包含中文字符的文件路径时,Python有时会表现出一些不友好的行为,下面小编就来为大家介绍一下具体的... 目录问题背景解决方案1. 设置正确的文件编码2. 使用pathlib模块3. 转换路径为Unicod

基于Python开发PDF转Doc格式小程序

《基于Python开发PDF转Doc格式小程序》这篇文章主要为大家详细介绍了如何基于Python开发PDF转Doc格式小程序,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 用python实现PDF转Doc格式小程序以下是一个使用Python实现PDF转DOC格式的GUI程序,采用T

将java程序打包成可执行文件的实现方式

《将java程序打包成可执行文件的实现方式》本文介绍了将Java程序打包成可执行文件的三种方法:手动打包(将编译后的代码及JRE运行环境一起打包),使用第三方打包工具(如Launch4j)和JDK自带... 目录1.问题提出2.如何将Java程序打包成可执行文件2.1将编译后的代码及jre运行环境一起打包2

C++初始化数组的几种常见方法(简单易懂)

《C++初始化数组的几种常见方法(简单易懂)》本文介绍了C++中数组的初始化方法,包括一维数组和二维数组的初始化,以及用new动态初始化数组,在C++11及以上版本中,还提供了使用std::array... 目录1、初始化一维数组1.1、使用列表初始化(推荐方式)1.2、初始化部分列表1.3、使用std::