如何从 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;
    

如何使函数返回 modulelevel 结构取决于函数处理?

这是我的modulelevel 结构:

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 并举个例子。 您可以同时传递指向modulelevel 的指针,然后返回一个标志来说明您设置了哪个,但正如@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 中的函数返回初步的未定义结构?的主要内容,如果未能解决你的问题,请参考以下文章

嵌套函数中的未定义变量

这是C ++中的未定义行为从悬空指针调用函数

如何防止此无锁堆栈函数中的未定义行为和 ABA 问题?

C ++ / Eclipse中的未定义符号错误[关闭]

何时在空实例上调用成员函数会导致 C++11 中的未定义行为? [复制]

嵌入式 C/C++:现有符号的未定义引用