Распространенные ошибки - C (СИ) - Ответ 10044017

Попытка компилировать программу, написанную на С, с помощью компилятора С++

Пожалуй, одна из самых частых ошибок. Чаще всего, напарываются на попытку привести тип void *, возвращаемый функцией malloc/calloc, к типу, на который указывает указатель, принимающий результат.

Компилятор при этом выдаёт сообщение вида

cannot convert from 'void *' to 'int *'

Дело в том, что в С приведение указателя, возвращаемого malloc, к конкретному типу является моветоном и ведёт к трудноуловимым ошибкам, то есть код выше написан правильно.

А в С++ введён запрет на неявное приведение из void *, то есть для С++ надо явно кастануть результат к (int *).

По историческим причинам (до первого стандарта ANSI/ISO malloc возвращал char * и была ошибка приведения, но потом придумали void *), в некоторой литературе приводятся примеры с явным приведением типа указателя, но вызваны они бездумным копированием старого кода.

Решение:

Для Windows необходимо переименовать расширение файла на .c

Для Linux использовать компилятор gcc вместо g++. Для clang указывать во флаге компиляции правильный стандарт языка (например -std=c99 вместо -std=c++98).

Вернуться к обсуждению:

Распространенные ошибки C