VS 2013 ошибка C2664 при попытке скомпилировать файл .c как .cpp

0

Я нахожусь на своем пути программирования моего первого внешнего для Max 6, но ошибка, вызываемая мной, удерживает меня. Я проработал неделю в Интернете, чтобы найти решение проблемы, но не повезло. Есть много тем, связанных с

error C2664: cannot convert parameter 1 from 'X' to 'Y'

но ни одно из предложенных решений не было подходящим для моего случая, поскольку оно, по-видимому, является специфичным для конкретного объекта.

Более того, у меня есть основной файл.c для моего внешнего, который использует различные другие.cpp файлы и библиотеки. По этой причине я хочу скомпилировать его как.cpp файл. Насколько мне известно, не должно быть проблем с этим. Однако, когда я пытаюсь скомпилировать его в Visual Studio, я получаю следующую ошибку:

error C2664: 't_object *object_alloc(t_object *,const char *,...)' : cannot convert argument 1 from 'void *' to 't_object *' "

Кто-нибудь столкнулся и сумел решить любую подобную проблему? Неужели у меня пропало нечто более глубокое?

Заранее спасибо!

  • 0
    Вставьте сюда свой код, это поможет
  • 0
    Нам нужно увидеть код.
Показать ещё 1 комментарий
Теги:
visual-studio-2013

2 ответа

3

C++, в отличие от C, не допускает неявное преобразование указателя void в указатель не-void. Кажется, что вы пытаетесь передать указатель void как первый аргумент этой функции, но поскольку он не может быть преобразован в тип параметра, возникает ошибка.

Вы можете решить эту проблему, наведя указатель void прямо на тип целевого указателя.

object_alloc(static_cast<t_object*>(p), ...)

(FYI, преобразование в обратном направлении --- указатель на не-void на указатель void --- является стандартным преобразованием и может выполняться неявно). static_cast разрешено выполнять обратную последовательность стандартных преобразований).

  • 0
    static_cast не будет компилироваться как C. И идея файла C, который может быть скомпилирован только как C ++, кажется ... Ну, бессмысленно.
  • 0
    Не более нелепо, чем пытаться скомпилировать C с помощью компилятора C ++ :-P
Показать ещё 1 комментарий
2

В C есть неявное преобразование из void* в любой тип указателя данных.

Вместе с декларациями неявных функций C это означает, что в C нехорошо бросать результат, например, malloc, потому что с отсутствующим заголовком (без объявления malloc), который будет неявно объявлять malloc с типом результата int и, по крайней мере, локальным кодом будет компилироваться без видимой ошибки... :(

В C++ нет неявного преобразования из void*.

Таким образом, в C++ не только должен, но чаще всего должен приводить результат, например, malloc.

К счастью, C++ не имеет неявных деклараций функций. :)


Хорошим решением для вашей конкретной проблемы может быть компиляция файла C как C (duh).

Однако имейте в виду, что контроль верхнего уровня комбинированной программы C и C++ должен быть лучше C++. Т.е. компилировать main как C++. Это потому, что C++ имеет некоторые дополнительные требования к библиотеке времени выполнения, такие как динамическая инициализация вещей.

Вместо файла реализации, который может быть скомпилирован как C или C++, рассмотрим только заголовок (только с чисто декларациями), который может использоваться с обоими языками. Это общий способ сделать что-то. Вы можете использовать условный extern "C" чтобы сделать декларации работоспособными также в C++.

Ещё вопросы

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