Компиляция кода C / C ++ на MacOS

0

У меня есть проект 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 он не работает.

Кто-нибудь может помочь с некоторыми соображениями по этому вопросу?

благодаря

  • 0
    Похоже, вы пытаетесь скомпилировать код, предназначенный для компиляции как C, с помощью компилятора C ++. Было бы ВЕРОЯТНО работать с использованием extern "C" { ... } вокруг содержимого в соответствующем заголовочном файле - или использовать gcc вместо g ++.
  • 0
    Какой компилятор вы используете? И как вы вызываете это?
Показать ещё 1 комментарий
Теги:
macos

1 ответ

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 не имеет шаблонов.)

  • 0
    Спасибо! Наконец-то мне пришлось внести изменения, которые вы предложили, вручную, чтобы все заработало.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню