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

标签 c++ c linux macos

我有一个在 Linux 上启动的 C/C++ 项目,现在我想将它移植到 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 上却失败了。

任何人都可以就此问题提供一些见解吗?

谢谢

最佳答案

库声明函数指针参数是这样的:

int (*Vec_PtrSortCompare)()

然后像这样调用它们:

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

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

然而,在 C++ 中,具有空参数列表的函数声明符指定该函数采用零参数。

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

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

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

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

关于c++ - 在 MacOS 上编译 C/C++ 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25838296/

相关文章:

c - 如果不使用 C 中的逻辑运算符、关系运算符或选择结构,如何将 11,12 和 13 的值分配给所有等于 10 的值?

c++ - Linux,C++,xft : how to use it?

c++ - 如何启用_if 具有可变模板参数的类?

c++ - 在套接字中发送/接收之间同步

c++ - "strongly happens before"是什么意思?

CUDA 数组缩减为元素总和。如何从设备向主机传达答案并打印?

linux - linux : send() 套接字编程

c - Linux timerfd> 每 x 秒调用一个函数而不阻塞代码执行

c++ - eclipse 编译但不运行

python - 如何在 C++ 中列出 Python 模块的所有函数名称?