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

标签 c operator-overloading return-value

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

现在的问题:

我必须合并:

图书馆一:

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/

相关文章:

c - 多线程排序应用程序

c++ - GCC:空程序 == 23202 字节?

c++ - 在没有注册表的情况下存储应用程序数据/设置的方法?

c++ - 如何声明运算符重载 < 以在需要时在类变量之间动态切换?

c - 通过带有类型通知的宏重载 C 中的运算符

c++ - 当我们返回一个像 vector,list 这样的 C++ 容器时。会发生什么?

c - 如何将NULL存储到节点中?

c# - 什么时候应该在 C# 中定义(显式或隐式)转换运算符?

javascript - 如何在 inputText 中显示指定值?(XPages)

c++ - 抛出异常与返回码