В языке 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 *
для каждого языка с минимальной многословностью?
static_cast
для преобразования в / изvoid*
. - person jamesdlin   schedule 03.10.2010static inline
(или определяемые реализацией эквиваленты, в случае C89) функции в заголовках, относящиеся к библиотеке, в основном написанной на C, но используемой обоими. Когда становится слишком сложно работать на пересечении, вы можете отказаться от этой функции какstatic inline
и просто написать ее на C. - person Steve Jessop   schedule 03.10.2010static inline
в файлах заголовков - это ложная преждевременная оптимизация. - person R.. GitHub STOP HELPING ICE   schedule 04.10.2010