У меня есть проект C/C++, который я начал в Linux, и я хочу его сейчас переносить в MacOS. Я столкнулся с проблемой:
Мой исходный код ссылается на библиотеку C (инструмент abc с https://bitbucket.org/alanmi/abc) и использует заголовочные файлы из этой библиотеки. При компиляции в Linux все идет хорошо, но при компиляции на MacOS все ломается. Ошибка, которую я получаю, следующая:
abc/src/misc/vec/vecPtr.h:895:33: error: too many arguments to function call, expected 0, have 2
В основном это связано с тем, как указатели функций обрабатываются на двух системах. Как я понял из поиска в Интернете, это то, что в C указатели на функции с пустой скобкой() считаются имеющими переменное количество аргументов, в то время как это не относится к C++. Похоже, что g++ в Linux умеет правильно компилировать такой код, пока на MacOS он не работает.
Кто-нибудь может помочь с некоторыми соображениями по этому вопросу?
благодаря
Библиотека объявляет аргументы указателя функции следующим образом:
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 не имеет шаблонов.)
extern "C" { ... }
вокруг содержимого в соответствующем заголовочном файле - или использовать gcc вместо g ++.