В C не является ошибкой приводить указатели к void *
.
Основным препятствием при переносе на C ++ является необходимость приводить указатели при возврате из функций, имеющих дело с универсальными указателями, таких как malloc
, и функций, объявленных в моем собственном коде, таких как void * block_get ( Blkno const blkno);
.
Однако мой код предназначен для успешной компиляции компиляторами C и C ++. Если я предоставляю явные приведения повсюду для C ++, они должны быть приведениями в стиле C, и я могу маскировать ошибки из-за приведения типов, не являющихся указателями, к типам указателей и от типов указателей на обоих языках.
Моя справочная ошибка следующая:
struct Cpfs *cpfs = calloc(1, sizeof(*cpfs));
которая в MSVC выдает:
Ошибка 2, ошибка C2440: «инициализация»: невозможно преобразовать из «void *» в «Cpfs *» e: \ src \ cpfs \ cpfs .c 179
Очевидно, я не могу использовать new
или static_cast
, которые я бы естественно использовал, если бы я больше не использовал C. Какой лучший способ предоставить максимальная безопасность типов окружающая void *
для каждого языка с минимальной многословностью?