在MacOS上编译C / C ++代码

时间:2014-09-14 21:41:22

标签: c++ c linux macos

我有一个C / C ++项目,我在Linux上开始,我想把它现在移植到MacOS。我面临的问题如下:

我的源代码链接到C库(来自https://bitbucket.org/alanmi/abc的abc工具)并使用该库中的头文件。在Linux上进行编译时,一切顺利,但在MacOS上进行编译时,事情往往会中断。我得到的错误如下:

abc/src/misc/vec/vecPtr.h:895:33: error: too many arguments to function call, expected 0, have 2

这主要是由于在两个系统上处理函数指针的方式。正如我在网上搜索所了解的那样,在C中,带有空括号()的函数指针被认为具有可变数量的参数,而在C ++中则不是这种情况。似乎Linux上的g ++能够正确地编译这样的代码,而在MacOS上它是失败的。

有人可以帮助解决一些有关此问题的见解吗?

由于

1 个答案:

答案 0 :(得分:1)

库正在声明函数指针参数,如下所示:

int (*Vec_PtrSortCompare)()

然后像这样调用它们:

Vec_PtrSortCompare(p->pArray+i, p->pArray+k-1)

在C中,具有空参数列表的函数声明符不指定它需要多少个参数。因此,您可以合法地将所需数量的参数传递给此类函数。但是,这种“可变参数”函数被认为已被弃用。

但是,在C ++中,带有空参数列表的函数声明符指定该函数采用零参数。

这种差异意味着您无法使用C ++编译器编译这样的头文件。您有两个选择:您可以使用此标头编译程序的各个部分,只使用C编译器并创建一个库或一组目标文件,然后使用C ++编译器编译其余程序(假设您有C ++部分)。

或者,您可以修复函数声明。从上下文看,函数应该声明为

int (*Vec_PtrSortCompare)(const void **a, const void **b)

(在适当的C ++中,这将是一个模板化的函数,以避免使用void *;但是,C没有模板。)