gpt4 book ai didi

c - C99 结构中的函数重载

转载 作者:太空宇宙 更新时间:2023-11-04 07:46:02 38 4
gpt4 key购买 nike

通常,在 C99 中,您可以通过使用 VA_ARGS 和一些宏技巧来实现函数重载(参数数量,而不是类型重载),例如:

#define THIRD_PARAMETER(_1,_2,_3,...) _3
#define NOTHING

例如:

void pr1(int x);
void pr2(int x, int y);
#define pr(...) THIRD_PARAMETER(__VA_ARGS__, pr2, pr1, NOTHING)(__VA_ARGS__)

(我添加了 NOTHING 宏,这样当我调用 pr(100) 时,C99 就不会提示传递给 ... 的参数为零> 打印 100,我希望我的程序与 C99 完全兼容)

但问题是:pr 不是一个函数,所以它不能赋值给一个结构体中的函数指针:

 // this is a dynamic array
struct array {
// ...
void (*insert)(struct array * a, ...);
// ...
};

假设我有 3 个版本的插入:single_insert、multiple_insert、range_insert,它们分别有 3、4、5 个参数。如何在 C99 结构中实现函数重载(参数数量)?可能吗?

最佳答案

suppose i have 3 versions of insert: single_insert, multiple_insert, range_insert, which have 3,4,5 arguments respectively. How can I implement function overloading (number of arguments) inside a C99 struct ? is it possible ?

您可以声明一个不提供原型(prototype)的函数指针,因此它可以兼容具有不同数字甚至不同类型参数的函数:

void (*insert)();

但是无论指向哪个函数,都会通过这样的指针调用——您不会根据参数列表选择不同的函数。此外,参数将受默认参数提升的约束,并且提升的参数必须在类型和数量上与实际函数参数一致。

如果您的指针声明确实提供了一个原型(prototype),并且您通过它调用指向的函数,那么该函数必须具有兼容的签名,因为“兼容”在语言规范中定义。特别是,可变参数和非可变参数函数声明彼此不兼容,因此您使用可变参数原型(prototype)声明指针的想法是不符合要求的。

因此,它实际上与结构没有任何关系。相反,问题是函数指针。您可以应用一个宏技巧,例如您描述的在几个函数指针中进行选择,或者您可以编写一个可变参数包装函数来执行这样的选择,但您不能将这样的选择编码到指针本身中。

关于c - C99 结构中的函数重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56924456/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com