尝试初始化结构内的联合时出错

Error when trying to initialize a union inside a struct

本文关键字:出错 初始化 结构      更新时间:2023-10-16

所以我是一个函数,它返回指向结构(parse_files_result_t*(的指针。此结构包含一个联合:

struct parse_files_result_t{
result_tag tag;
union {
struct parse_file_error_t *err_ptr;
struct parse_file_response_t *ok_ptr;        
} data;
};

我想使用联合来根据函数中的计算返回*err_ptr*ok_ptr

所以我写了以下代码:

parse_files_result_t* result = (parse_files_result_t*)malloc(sizeof (parse_files_result_t));
if (success) {        
parse_file_response_t response = //data
*result = parse_file_result_t{result_tag::Ok, result->data.ok_ptr = &response};
return result;
} else {
parse_file_error_t errorresponse = //data
*result = parse_files_result_t{{result_tag::Err}, {result->data.err_ptr = &errorresponse}};
return result;
}

目前为止,一切都好。返回parse_file_error_telse部分工作正常,因为parse_file_error_t是联合的第一部分。在if部分,我只想返回parse_file_response_t.因为这是工会的第二个"部分",所以我得到这个错误:

错误:无法在初始化时将"parse_file_response_t*"转换为"parse_file_error_t*">

即使我写了result->data.ok_ptr,我的编译器也试图将parse_file_response_t response放入联合的parse_file_error_t部分。

我该如何解决这个问题?

感谢您的帮助!

即使我写了result->data.ok_ptr,我的编译器也试图将parse_file_response_t response放入联合的parse_file_error_t部分。

是的。你把这么多东西压缩到一行里,你忘记了你告诉计算机做什么。

*result = parse_files_result_t{result_tag::Ok, result->data.ok_ptr = &response};

这个声明做了几件事。(从内到外工作,跟着走。我们将从result->data.ok_ptr = &response开始,一直锻炼到*result = [stuff]

  1. response的地址分配给result->data.ok_ptr
  2. (临时(parse_files_result_t对象是使用初始值result_tag::Ok和在步骤 1 中分配的值构造的。这些值分配给tagdata.err_ptr成员,因此会出现错误。
  3. 将步骤 2 中构造的对象分配给*result,覆盖在步骤 1 中完成的分配。

简化您的代码以(几乎(获得您想要的内容。

result->tag = result_tag::Ok;
result->data.ok_ptr = &response;

这提供了更多的代码行,但语法更清晰。此外,您为计算机创建的工作更少,因为这不再尝试创建临时parse_files_result_t对象。

但是,仍然存在一个问题,因为result->data.ok_ptr将是一个悬而未决的指针。不幸的是,我认为解决这个问题(以及解决其他问题(超出了你的问题范围。