Меня немного смущает применимость reinterpret_cast
против static_cast
. Из того, что я прочитал, общие правила - использовать статическое приведение, когда типы можно интерпретировать во время компиляции, отсюда и слово static
. Это приведение, которое компилятор C ++ использует также для неявных приведений.
reinterpret_cast
s применимы в двух сценариях:
- преобразовать целочисленные типы в типы указателей и наоборот
- преобразовать один тип указателя в другой. Общая идея, которую я получаю, заключается в том, что это непереносимо, и этого следует избегать.
Я немного смущен тем, что мне нужно, я вызываю C ++ из C, и код C должен удерживать объект C ++, поэтому в основном он содержит void*
. Какое приведение следует использовать для преобразования между типом void *
и типом класса?
Я видел использование как static_cast
, так и reinterpret_cast
? Хотя из того, что я читал, кажется, что static
лучше, поскольку приведение может происходить во время компиляции? Хотя там сказано использовать reinterpret_cast
для преобразования одного типа указателя в другой?
reinterpret_cast
не происходит во время выполнения. Оба они являются операторами времени компиляции. Из en.cppreference.com/w/cpp/language/reinterpret_cast: В отличие от static_cast, но, как и const_cast, выражение reinterpret_cast не компилируется ни в какие инструкции ЦП. Это чисто директива компилятора, которая инструктирует компилятор обрабатывать последовательность битов (представление объекта) выражения, как если бы она имела тип new_type. - person Cris Luengo   schedule 03.03.2017