gpt4 book ai didi

c - C 共享库中的函数重载(不同的返回类型,不同数量的参数)

转载 作者:太空宇宙 更新时间:2023-11-04 04:51:34 25 4
gpt4 key购买 nike

我的工作是创建一个共享库,它应该可以用来替代其他共享库的几个(旧)版本。

现在的问题:

我必须合并:

图书馆一:

const char *mixer_ctl_get_enum_string(struct mixer_ctl *ctl, unsigned int enum_id);
const char *mixer_ctl_get_name(struct mixer_ctl *ctl);

图书馆 b:

int mixer_ctl_get_enum_string(struct mixer_ctl *ctl, unsigned int enum_id, char *string, unsigned int size);
int mixer_ctl_get_name(struct mixer_ctl *ctl, char *name, unsigned int size);

我发现了如何处理多个输入参数,但现在它们也有不同的返回类型。我在 C++ 中找到了这方面的示例,但在 C 中找不到。

我该怎么做?

如果 C 能像 Java 一样工作,我会同时实现两者,一切都很好,但是在 C 中?

感谢您的帮助和亲切的问候!

最佳答案

没有简单或通用的解决方案。

在 C++ 中,您可以将函数打包到类中,并且函数名称只需要在类中是唯一的即可。 C 没有这个。

在 C++ 中,返回类型和参数类型算作函数名称的一部分(因此 void foo(int)void foo(float) 实际上是不同的函数和编译器知道调用哪个)。 C 没有这个。

在 C 中有一个单一的全局命名空间,并且类型算作函数名称的一部分。正如其他人所指出的,标准 C 函数名称对于不同的返回类型是不同的:sqrt() 返回 doublesqrtf() 返回 float

C 中的一些函数可以接受不同数量的参数;一个典型的例子是 printf()。但是这些写起来很棘手,而不是解决您问题的一般方法。在 printf() 的情况下,有一个“格式字符串”参数,printf() 函数只需要相信格式字符串与参数正确匹配到 printf()。 (好吧,由于 printf() 很常见,一些编译器实际上会根据参数检查格式字符串,但是您的库函数没有这个优势!)

我用 C 做了很多工作,单一的全局命名空间是 C 最恼人的限制之一。您是否有机会在这个项目中实际使用 C++?如果您使用 C++ 的基本特性,您可以将其视为“C with classes”,并仅利用命名空间和函数重载。

否则,我认为最好的办法是使用重构工具,或者文本编辑器中非常好的搜索和替换功能,将函数名称更改为全局唯一。一个明显的方法是更改​​每个函数以将库名称作为前缀:

const char *a_mixer_ctl_get_name(struct mixer_ctl *ctl);  // library a
int b_mixer_ctl_get_name(struct mixer_ctl *ctl, char *name, unsigned int size); // library b

然后您将不得不使用旧库重构或搜索并替换程序,但由于这些库相互矛盾,您应该很容易让事情重新开始工作。

关于c - C 共享库中的函数重载(不同的返回类型,不同数量的参数),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14518052/

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