我有创建共享库的工作,该库应该可以替代其他共享库的几个(较旧)版本。
现在出现问题:
我必须结合起来:
图书馆a:
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?
感谢您的帮助&亲切的问候!
答案 0 :(得分:0)
C中没有函数重载。
原因是组装生成中没有名称损坏。在C ++中,具有不同类型的重载函数将具有不同的错位名称,在C - not。
中通常的做法是为不同类型的函数指定不同的名称,例如
float sqrtf(float x);
double sqrt(double x);
long double sqrtl (long double x);
等等......
答案 1 :(得分:0)
C不提供函数重载工具,共享库机制也不提供。区分函数调用的唯一方法是使用不同的名称。
要解决不同接口的问题(返回类型,参数......),我建议构建3个共享库:
毋庸置疑,您可以更改应用程序A& B随着时间的推移,可以直接使用组合库。
答案 2 :(得分:0)
没有简单或一般的解决方案。
在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”,并且只是利用命名空间和函数重载。
否则我认为最好的办法是在文本编辑器中使用重构工具或非常好的搜索和替换功能,将功能名称更改为全局唯一。一个显而易见的方法是更改每个函数以将库名称作为前缀:
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
然后你必须使用旧库重构或搜索和替换程序,但由于这些库是相互矛盾的,你应该很容易让事情重新开始。