Меня немного смущает применимость reinterpret_cast
против static_cast
. Из того, что я прочитал, общие правила заключаются в использовании статического приведения, когда типы могут интерпретироваться во время компиляции, отсюда и слово static
. Это приведение, которое компилятор C ++ использует внутренне для неявных приведений.
reinterpret_cast
Они применимы в двух сценариях:
- конвертировать целочисленные типы в типы указателей и наоборот
- преобразовать один тип указателя в другой. Общая идея, которую я получаю, заключается в том, что это непереносимо, и его следует избегать.
Там, где я немного запутался, это одно использование, которое мне нужно, я вызываю C ++ из C, а код C должен удерживать объект C ++, поэтому в основном он содержит a 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. "