1

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

现在的问题:

我必须结合:

图书馆一:

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 中呢?

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

4

3 回答 3

0

C中没有函数重载。

原因是程序集生成中没有名称修饰。在 C++ 中,具有不同类型的重载函数将具有不同的重载名称,而在 C 中则不是。

所以通常的做法是为不同类型的函数指定不同的名称,比如

float sqrtf(float x);
double sqrt(double x);
long double sqrtl (long double x);

等等...

于 2013-01-25T08:36:56.820 回答
0

C 不提供函数重载工具,共享库机制也不提供。区分函数调用的唯一方法是使用不同的名称。

为了解决您的不同接口(返回类型、参数等)的问题,我建议构建 3 个共享库:

  1. 具有特定接口的组合功能的共享库
  2. 应用程序 A 的代理共享库,提供预期的接口,将调用传递给组合库
  3. 应用程序 B 的代理共享库,提供预期的接口,将调用传递给组合库

不用说,随着时间的推移,您可能会更改应用程序 A 和 B 以直接使用组合库。

于 2013-01-25T08:36:57.217 回答
0

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

在 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”,并利用命名空间和函数重载。

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

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

然后,您将不得不使用旧库重构或搜索和替换程序,但由于这些库是相互矛盾的,您应该很容易让事情再次正常运行。

于 2013-01-25T08:44:40.670 回答