我的工作是创建一个共享库,它应该可以用来替代其他共享库的几个(旧)版本。
现在的问题:
我必须合并:
图书馆一:
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()
返回 double
但 sqrtf()
返回 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/