如何从 C 中的函数返回初步的未定义结构?
Posted
技术标签:
【中文标题】如何从 C 中的函数返回初步的未定义结构?【英文标题】:How to return preliminary undefined struct from a function in C? 【发布时间】:2021-10-09 05:53:19 【问题描述】:一个小sn-p如下图:
struct module SELECT(FILE *f, int id, int db)
if (id == 1)
module table;
return table;
else if (id == 2)
level table;
return table;
如何使函数返回 module
或 level
结构取决于函数处理?
这是我的module
和level
结构:
typedef struct module
int id;
char name[30];
int mem_num;
int cell_num;
int del;
module;
typedef struct level
int mem_num;
int cell_count;
int def;
level;
调用示例:
str 与关卡结构连接的 IK(例如)。
FILE *tmp = fopen(str, "r");
level res = SELECT(tmp, 1, 1);
【问题讨论】:
SELECT
被声明为返回 module
,但您在 SELECT
的第 7 行中返回了 level
。你期待什么?
你不能。一个函数有一个返回类型。做两个函数。
这看起来像XY Problem
你打算怎么打电话给SELECT
? Edit 并举个例子。
您可以同时传递指向module
和level
的指针,然后返回一个标志来说明您设置了哪个,但正如@Jabberwocky 所说,您可能遇到了XY 问题。
【参考方案1】:
您可以使用union
。
module_or_level SELECT(FILE *f, int id, int db)
if (id == 1)
module_or_level table = .type = t_module, .m = ... ;
return table;
else if (id == 2)
module_or_level table = .type = t_level, .l = ... ;
return table;
typedef struct module
int id;
char name[30];
int mem_num;
int cell_num;
int del;
module;
typedef struct level
int mem_num;
int cell_count;
int def;
level;
enum module_or_level_type
t_level,
t_module
;
typedef struct
enum module_or_level_type type;
union
module m;
level l;
;
module_or_level;
调用:
FILE *tmp = fopen(str, "r");
module_or_level res = SELECT(tmp, 1, 1);
switch(res.type)
case t_module: do_something_with(res.m); break;
case t_level: do_something_with(res.l); break;
【讨论】:
【参考方案2】:如何使函数返回模块或层次结构取决于函数处理?
你不能这样做,在这种情况下甚至不应该尝试。这并不完全正确,您可以使用 void 指针和奇怪的强制转换或使用其他奇怪的方法,但在这种情况下没有任何好处。
只要有两个不同的函数并根据需要调用它们:
module SELECT_MODULE(FILE *f, int db)
module table;
...
return table;
level SELECT_LEVEL(FILE *f, int db)
level table;
...
return table;
FILE *tmp = fopen(str, "r");
...
level res = SELECT_LEVEL(tmp, 1);
...
module mod = SELECT_MODULE(tmp, 1);
【讨论】:
以上是关于如何从 C 中的函数返回初步的未定义结构?的主要内容,如果未能解决你的问题,请参考以下文章