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

相关文章

uniapp接入微信小程序原生代码配置方案(优化版)

uniapp项目需要把微信小程序原生语法的功能代码嵌套过来,无需把原生代码转换为uniapp,可以配置拷贝的方式集成过来 1、拷贝代码包到src目录 2、vue.config.js中配置原生代码包直接拷贝到编译目录中 3、pages.json中配置分包目录,原生入口组件的路径 4、manifest.json中配置分包,使用原生组件 5、需要把原生代码包里的页面修改成组件的方

Java面试八股之怎么通过Java程序判断JVM是32位还是64位

怎么通过Java程序判断JVM是32位还是64位 可以通过Java程序内部检查系统属性来判断当前运行的JVM是32位还是64位。以下是一个简单的方法: public class JvmBitCheck {public static void main(String[] args) {String arch = System.getProperty("os.arch");String dataM

公共筛选组件(二次封装antd)支持代码提示

如果项目是基于antd组件库为基础搭建,可使用此公共筛选组件 使用到的库 npm i antdnpm i lodash-esnpm i @types/lodash-es -D /components/CommonSearch index.tsx import React from 'react';import { Button, Card, Form } from 'antd'

(超详细)YOLOV7改进-Soft-NMS(支持多种IoU变种选择)

1.在until/general.py文件最后加上下面代码 2.在general.py里面找到这代码,修改这两个地方 3.之后直接运行即可

一道经典Python程序样例带你飞速掌握Python的字典和列表

Python中的列表(list)和字典(dict)是两种常用的数据结构,它们在数据组织和存储方面有很大的不同。 列表(List) 列表是Python中的一种有序集合,可以随时添加和删除其中的元素。列表中的元素可以是任何数据类型,包括数字、字符串、其他列表等。列表使用方括号[]表示,元素之间用逗号,分隔。 定义和使用 # 定义一个列表 fruits = ['apple', 'banana

SQL Server中,用Restore DataBase把数据库还原到指定的路径

restore database 数据库名 from disk='备份文件路径' with move '数据库文件名' to '数据库文件放置路径', move '日志文件名' to '日志文件存放置路径' Go 如: restore database EaseWe from disk='H:\EaseWe.bak' with move 'Ease

美容美发店营销版微信小程序源码

打造线上生意新篇章 一、引言:微信小程序,开启美容美发行业新纪元 在数字化时代,微信小程序以其便捷、高效的特点,成为了美容美发行业营销的新宠。本文将带您深入了解美容美发营销微信小程序,探讨其独特优势及如何助力商家实现业务增长。 二、微信小程序:美容美发行业的得力助手 拓宽客源渠道:微信小程序基于微信社交平台,轻松实现线上线下融合,帮助商家快速吸引潜在客户,拓宽客源渠道。 提升用户体验:

程序人生--拔丝地瓜

一个会享受生活的人,难免会执迷于探索“三餐茶饭,四季衣裳”的朴素涵义。如今在这繁杂喧闹、竞争激烈的社会环境里,如何才能从周而复始的生活中挖掘出一点儿期待!这是一个仁者见仁智者见智的开放性话题。对于大部分的人来说,看电影、运动、旅游、美食、加班....是假日的备选安排。 春节临走之前,再次尝试“拔丝地瓜”,为何要强调“再次”二字?因为这道甜菜我已经尝试过很多次,失败与成功都经历过。十几年的烧饭经历

XMG xib中不属于一个类的控件,拖线到指定的类中

1.比如我现在有一个view绑定为GreenView,我们按住control向类里面拖线的方式想要达到目的,显然拖不进去。例图如下 那么我们此时还想要达到目的,就需要自己去GreenView的类内部去写IBo 然后这面连接起来 2.第二,大哥郝良建给做的扩展 可以在.h或者.m中写一个NSObject的属性 然后在xib中对应的位置创建一个NSObject的属性

MybatisPlus指定字段查询

一,上代码 QueryWrapper<Device> queryWrapper = Wrappers.query();queryWrapper.select("project_id as projectId,count(device_id) as total").in("project_id",projectIds).isNotNull("project_id").eq("del_flag",B