当通过交叉路口合并可选的属性时,必需的获胜 type A = { who: string } type B = { who?: string } // $ExpectType {who:string} type R = A & B 这可能会导致运行时错误,例如,处理函数中的默认参数模式 type Params = { who: string greeting: string } const defaults: Params = { greeting: 'Hello', who: 'Johny 5', } function greeting(params: Partial){ // $ExpectType Params const merged = {...defaults, ...params} return `${merged.greeting.toUpperCase()} ${merged.who} !` } //
以下是关于 unions 的编程技术问答
i具有一个函数,该函数采用一些参数并生成将传递到外部进程的对象.正弦我无法控制最终需要创建的形状,我必须能够对我的功能进行一些不同的参数并将它们组装到适当的对象中.这是一个非常基本的示例,展示了我遇到的问题: interface T1A { type: 'type1'; index: number; } interface T1B { type: 'type1'; name: string; } interface T2A { type: 'type2'; index: number; } interface T2B { type: 'type2'; name: number; } function hello(type: 'type1' | 'type2'): T1A | T1B | T2A | T2B { return {type, index: 3} } 此特定功能抱怨" type1"不可分配
我想知道是否有人知道是否可以在工会内使用继承. 在下面的示例中,TestFails联合将不包含a struct中的a变量,而TestWorks确实可以使用. struct Base { int a; }; union TestFails { struct : public Base {}; int b; }; union TestWorks { struct { int a; }; int b; }; int main() { TestWorks works; works.a = 0; TestFails fails; fails.a = 0; return 0; } 您可以在此处测试代码: http://ideone.com/duzpor 解决方案 首先 - 您假设TestWorks有效是错误的. 这不是标准的C ++ - 仅扩展到它 - 它被称为 nonymed struct
我有以下内容: #include typedef union u_data { struct { int a; int b; int c; }; int elem[3]; } my_data; int main(void) { my_data data; data.a = 3; data.b = 5; data.c = -3; printf("%d, %d, %d\n", data.elem[0], data.elem[1], data.elem[2]); } ,它正如我预期的那样工作:3, 5, -3 但是,我知道结构可以在它们中带有填充物,因此这意味着结构中的元素可能并不
大家好, 我想知道工会是否使用填充? 由于联合的大小是最大的数据成员大小,因此可以在末尾有填充吗? 解决方案 由于联合的大小是最大的数据成员大小 不必是真的.考虑 union Pad { char arr[sizeof (double) + 1]; double d; }; 该工会的最大成员是arr.但是通常,A double将在四个或八个字节的倍数上对齐(取决于架构和double的大小).在某些体系结构上,这甚至是必要的,因为它们根本不支持未对齐的读物. so sizeof (union Pad)通常大于sizeof (double) + 1 [通常在64位系统上16 = 2 * sizeof (double),而在32位系统上进行16或12 64位double,double的所需对齐方式仍然只有四个字节)]. 这意味着必须在联盟中有填充,并且只能放在末端. 通常,A union的大小将是任何不小于最大成员所需的最大对准
我的代码中有一个struct iof_header,我确定它将是24个字节宽.我执行一个大小(iof_header),它返回32个字节宽. 问题1 为什么它是32个字节宽而不是24? 问题2 包括其成员,如何存储在内存中? 问题3 我发现任何时候创建一个字节[4-8&20-24]的结构之一都是无效的,我会在我的字符阵列中看到这一点.阵列读取如下{4 bytes of BASEID_Code, 4 NULL bytes, 8 bytes of zeroed padding, 4 bytes of ASID_Code, 4 NULL bytes, 8 bytes of size} 我的unsigned __int32成员的末端有空字节,为什么会发生这种情况? 这可能是相关的吗?可能使CPU能够更快地处理这些数据类型的效率可能? struct iof_header { union { str
我已经在火鸟(方言3)中写了一个程序,它返回了我这样的东西: column1 | column2 | column3 | column4 | ... ----------|-------------|-----------|------------|-------- 1 | 55 | 2.5 | 100€ | ... 特定的列名称并不重要.我像这个 一样访问它 SELECT * FROM MY_PROCEDURE(:START_DATE, :END_DATE); 它仅返回一行,所以我想我也可以使用execute_procedure访问它. 现在,我想要的是将列和行中的行转换 中的行 row | result ----------|--------- column1 | 1 column2 | 55 column3 | 2.0
我在解决c-Union结构XEvent方面有问题. 我正在尝试Xlib和X记录扩展.我正在使用 Rust-Bindgen 生成FFI结合.所有代码在github alxkolm/rust-xlib-record . 麻烦发生在行 src/main. RS:106 当我尝试从Xevent结构中提取数据时. let key_event: *mut xlib::XKeyEvent = event.xkey(); println!("KeyPress {}", (*key_event).keycode); // this always print 128 on any key 我的程序侦听密钥事件并打印出keycode.但是我按任何键上总是128.我认为从C联合类型到Rust类型的错误转换. XEvent的定义从这里开始 src/xlib .rs:1143 .这是c-工会.原始c定义在这里. github的代码可以通过cargo run命令运行.它是没有错误
在ISO/IEC 9899:2018(C18),6.2.3"标识符的名称空间"(强调我的): 6.2.3标识符的名称空间 1如果在翻译单元中的任何一点上都可以看到多个特定标识符的声明,则语法上下文disamame disamage disamage disamage disamage disame disame dismage disemautes使用了指的是不同实体.因此,各种标识符都有单独的名称空间,如下: 标签名称(通过标签声明的语法和使用的语法歧义); 结构,工会和枚举的标签(通过以下32的歧义)构成关键字结构,联合或枚举); 结构或工会的成员;每个结构或联合都有一个单独的名称空间(被用于通过.或 - > operator访问成员的表达式的类型歧义); 所有其他标识符,称为普通标识符(在普通声明者或枚举常数中声明). 32)只有一个标签的名称空间即使三个是可能的. 即使三个是可能的."这是什么意思. 作为实验,我尝试编译以下代码:
我必须创建一个用Union作为数据类型的列表,但事实证明,创建我的列表后,我所有列表中只有相同的值.我该如何处理? 您能帮我这个方向吗? 对您来说美好的一天 结构,联合和功能声明 #include #include #include //Declaration of list struct list_t{ struct node_t *head; struct node_t *tail; }; struct node_t { union val_t *vals; struct node_t *prev; struct node_t *next; }; //Declaration of Union union val_t{ int as_int; double as_double; char *as_str; }; int insert
在C ++ 11中,Union支持非POD成员.我想在构造函数中初始化非POD成员. 在wikipedia c ++上11 page ,它使用了一个位置'新的'初始化非POD成员. #include // Required for placement 'new'. struct Point { Point() {} Point(int x, int y): x_(x), y_(y) {} int x_, y_; }; union U { int z; double w; Point p; // Illegal in C++03; legal in C++11. U() {new(&p) Point();} // Due to the Point member, a constructor definition is now required. }; 我想知道如果我使用ctor-initializer-
这是我谈论的关系: struct A{ int i = 1; }; struct B{ union{A a;}; }; void main(){ B b; }; 在此星座中,我的编译器(VS2015)抱怨删除了b B::B(void) beeing的默认构造函数,并注明了编译器已生成B::B: ../test.cpp(155): error C2280: "B::B(void)" : Es wurde versucht, auf eine gelöschte Funktion zu verweisen ../test.cpp(152): note: Compiler hat hier "B::B" generiert (对不起,我无法说服MSVC与我说英语) 这两个代码更改中的任何一个都可以解决: struct A{ int i; //removed initialzation of member to 1 }; 或
作为 9.5.1 [class.union] 在联合中,最多可以在任何时候活跃,即,最多可以存储非静态数据成员的值随时在工会中. [...]联合的大小足以容纳其最大的非静态数据成员.每个非静态数据成员都被分配,就好像它是结构的唯一成员一样.联合对象的所有非静态数据成员都有相同的地址. ,但我不知道如何确定联盟的活跃成员,我不足以潜入标准以找到标准所说的内容,我试图弄清楚如何活动成员已设置,但我发现了它的交换方式: 9.5.4 [class.union] [ Note :通常,必须使用明确的破坏性呼叫和安置新操作员来更改联合的活动成员. - end Note ] [示例:考虑A union type U的对象u具有类型M和n的非静态数据成员的类型N.如果M具有非平凡的驱动器,并且N具有非平凡的构造函数(例如,如果它们声明或继承了虚拟函数),则可以将U的活动成员安全地从m> n安全切换使用灾难和位置如下: u.m.~M(); new (&u.n) N; -
我正在尝试实现一种自定义变体类型,该类型使用联合来存储各种不同类型的数据.在字段中,我计划存储哪个输入联合中存储的数据.工会包含非平凡的成员.这是我当前的实施: struct MyVariant { enum { t_invalid, t_string, t_int, t_double, t_ptr, t_dictionary } type_id; union { int as_int; double as_double; std::string as_string; std::unique_ptr as_ptr; std::map as_dictionary; }; }; 我尝试创建一个MyVariant
我正在更新我的结构,我想在其中添加一个std ::字符串成员.原始结构看起来像这样: struct Value { uint64_t lastUpdated; union { uint64_t ui; int64_t i; float f; bool b; }; }; 当然,仅在联合中添加一个std ::字符串成员会导致编译错误,因为通常需要添加对象的非平凡构造函数. 在std :: string :: string(来自Informit.com的text.com) 由于STD :: String定义了所有六个特殊成员函数,因此您将具有隐式删除的默认构造函数,复制构造函数,复制分配运算符,移动构造函数,移动分配操作员和Destructor.有效地,这意味着除非您明确定义某些或所有特殊成员函数,否则您将无法创建u的实例. 然后,网站继续提供以下示例代码: union U { int a; int b; string
与constexpr和union一起玩,我发现我无法更改constexpr in union的活动成员.只是一个例外:union空的类. constexpr bool t() { struct A {}; struct B {}; union U { A a; B b; } u{}; u.a = A{}; u.b = B{}; return true; } static_assert(t()); constexpr bool f() { struct A { char c; }; struct B { char c; }; union U { A a; B b; } u{}; u.a = A{}; u.b = B{}; // error originating from here return true; } static_assert(f()); 第一个功能可能会产生恒定表达.但
与C ++不同,C没有const_cast的概念.也就是说,没有有效的方法可以将康斯特合格的指针转换为不合格的指针: void const * p; void * q = p; // not good 首先关闭:这种铸造实际上是未定义的行为吗? 无论如何,GCC都警告一下.为了制作需要const铸造的"干净"代码(即我可以保证我不会突变内容,但我只有一个可变的指针),我已经看到了以下"转换"技巧: typedef union constcaster_ { void * mp; void const * cp; } constcaster; 用法:u.cp = p; q = u.mp;. C语言通过这样的联盟抛弃宪法的规则是什么?我对C的了解只是非常斑驳的,但是我听说C比C ++更宽容,因此,尽管我对这种结构有不好的感觉,但我希望从标准中进行争论(我想C99,我想C99虽然如果在C11中发生了变化,那么很高兴知道). 解决方案
这似乎是未定义的行为 union A { int const x; float y; }; A a = { 0 }; a.y = 1; 规格说 在存储位置创建一个新对象,该存储位置具有静态,线程或自动存储持续时间的const对象占据或在此类const对象在其寿命结束之前占用的存储位置导致不确定的行为. ,但没有编译器警告我,这很容易诊断错误.我正在误解措辞吗? 解决方案 最新的C ++ 0x标准标准是明确的: 在联合中,最多有一个非静态数据成员可以在任何 时间,即,最多有一个非静态数据成员的值可以 随时存放在工会中. 所以你的语句 a.y = 1; 很好,因为它将活动成员从x更改为y.如果您随后将a.x引用为rvalue,则该行为将不确定: cout
在相关问题中没有找到任何东西.很可能是超级菜鸟,但是无论如何我都会问/我的.h文件中有以下内容: typedef union _API_Packet_0x90{ uint8_t packet[26]; struct _pack_struct { uint8_t start; uint8_t length[2]; uint8_t addr64[8]; uint8_t addr16[2]; uint8_t options; uint8_t rfData[4]; uint8_t chksum; }; } API_Packet_0x90; API_Packet_0x90 ap90; 这是微控制器的代码,我正在使用XC8工具链(前HI Tech C).编译器说: xbee_api.h:19:警告:缺少基本类型; int假设 xbee_api.h