C 有没有办法保持函数变量的返回类型?

C 有没有办法保持函数变量的返回类型?,c,function,struct,return-type,C,Function,Struct,Return Type,我想定义一个函数,它返回一个带有多个变量类型值的struct,或者一个int*,取决于参数,用户通过命令行进行传递。我知道,我可以简单地返回一个struct,并从与用户输入数据相关的struct中检索特定值,但我想知道是否有可能声明函数将返回a或B。否,函数返回类型必须在编译时确定和固定,它不能在运行时更改(即,基于用户输入) 但是,您可以使用函数指针数组根据用户输入调用不同的函数。最接近的方法可能是返回包含其他类型信息的结构的联合 typedef结构{ MyType类型; int-alpha;

我想定义一个函数,它返回一个带有多个变量类型值的
struct
,或者一个
int*
,取决于参数,用户通过命令行进行传递。
我知道,我可以简单地返回一个
struct
,并从与用户输入数据相关的
struct
中检索特定值,但我想知道是否有可能声明函数将返回a或B。

否,函数返回类型必须在编译时确定和固定,它不能在运行时更改(即,基于用户输入)


但是,您可以使用函数指针数组根据用户输入调用不同的函数。

最接近的方法可能是返回包含其他类型信息的结构的联合

typedef结构{
MyType类型;
int-alpha;
浮动β;
字符*伽马;
}A;
类型定义结构{
MyType类型;
int*数据;
}B;
typedef联合{
MyType类型;
A A;
B B;
}可退还的;
//可退还的func(作废);
但是,您需要在函数调用之前检查args,或者在函数调用之后检查
type
字段。在后一种情况下,您将丢失compiletime类型检查,并发明运行时类型检查,这很容易出错


正如@EricPostpischil在评论中所建议的,还有一种方法:

typedef结构{
int foo;
}A;
类型定义结构{
炭条;
}B;
类型定义结构{
MyType数据类型;
联合{
A A;
B B;
}数据;
}可退回2;

最好在C中实现某种polimorphism

#define mul3(x) _Generic((x), \
    double: mul3d, \
    int: mul3i)(x)

int mul3i(const int x)
{
    printf("Mul3 int %d * 3 = %d\n", x, x*2);
    return x * 3;
}

double mul3d(const double x)
{
    printf("Mul3 double %f * 3 = %f\n", x, x*2);
    return x * 3;
}

int main()
{
    mul3(5.0);
    mul3(4);
}

不,没有。您可以返回一个“void*”,您可以在其中随意施放。但是这将是一个非常糟糕的做法,它必须在函数的文档中非常清晰,并且你失去了对类型检查的兴趣。这样做没有相互影响,只会增加复杂性,这只是说这在技术上是可能的,但这不是一件好事。只需按照问题第二句中的建议去做,这就是正确的方法。返回一个结构并根据结构中的某个“类型”字段检索特定值。不需要函数指针,只需执行if-else或切换大小写并直接调用函数即可。@Fredrik很有可能,但如果需求多样化,这种方法将无法扩展,如果开关大小写是可能的,它将很好地扩展,因为开关大小写很可能编译成一个跳转表。在这种情况下函数指针有什么帮助?在通过指针调用函数的站点上,它必须有一个返回类型。严格来说,联盟中的裸
MyType
可能需要在其自身的
struct
中,但我并没有深入研究C标准来找出这一点,如果裸
MyType
确实需要在
struct
中才能利用“初始成员的公共序列”允许访问
联合
中的任何类型,这是一个足够微妙的点,无注释的向下投票是浪费的。没有理由将
MyType
放在其他结构中。更好的设计是返回一个结构,其中一个元素表示一个类型(通过一个枚举,可能称为
MyType
,或类似的方法),另一个是要返回的所有可能类型的并集。另一个无声的DV terc是什么样的标准有效?c11-大约10年前。哇,_Generic肯定已经从我身边溜走了。我必须试一下。