Если я использую static_cast или reinterpret_cast при кастинге пустоты* ко что

Есть так много ответов для PHP и MySQL, но вот код для PHP и Oracle для предотвращения SQL-инъекций, а также регулярное использование драйверов oci8:

$conn = oci_connect($username, $password, $connection_string);
$stmt = oci_parse($conn, 'UPDATE table SET field = :xx WHERE ID = 123');
oci_bind_by_name($stmt, ':xx', $fieldval);
oci_execute($stmt);
182
задан Andy 10 April 2010 в 05:06
поделиться

4 ответа

Использование static_cast : это - самый узкий бросок, который точно описывает то, какое преобразование сделано здесь.

There’s неправильное представление, что использование reinterpret_cast было бы лучшим соответствием, потому что это means “completely игнорирует безопасность типов и просто бросок от до B”.

Однако этот doesn’t на самом деле описывают эффект reinterpret_cast. Скорее reinterpret_cast имеет много значений, для всех из которых содержит это, отображение “the, выполненное reinterpret_cast, определяется реализацией. ” [5.2.10.3]

, Но в особом случае кастинга от void* до T* отображение абсолютно четко определен по стандарту; а именно, для присвоения типа указателю без типов, не изменяя его адрес.

Это - причина предпочесть static_cast.

Кроме того, и возможно более важный, то, что каждое использование reinterpret_cast совершенно опасно, потому что оно преобразовывает что-либо во что-либо еще действительно (для указателей), в то время как static_cast намного более строго, таким образом обеспечивая лучший уровень защиты. Это уже сохранило меня от ошибок, где я случайно пытался принудить один тип указателя в другого.

132
ответ дан Konrad Rudolph 23 November 2019 в 06:06
поделиться

Мое персональное предпочтение основано на грамотности кода как это:

void* data = something;
MyClass* foo = reinterpret_cast<MyClass*>(data);
foo->bar();

или

typedef void* hMyClass; //typedef as a handle or reference
hMyClass = something;
const MyClass& foo = static_cast<MyClass&>(*hMyClass);
foo.bar();

они оба делают то же в конце, но static_cast кажется более соответствующим в промежуточном программном обеспечении, среда приложения, в то время как дают иное толкование броску, больше походит на что-то, что Вы видели бы в библиотеке IMHO низшего уровня.

-7
ответ дан Robert Gould 23 November 2019 в 06:06
поделиться

Это - сложный вопрос. С одной стороны, Konrad высказывает точное мнение об определении спецификации для reinterpret_cast, хотя на практике это, вероятно, делает то же самое. С другой стороны, если Вы бросите между типами указателей (как довольно распространено при индексации в памяти через символ*, например), , то static_cast генерирует ошибку компилятора, и Вы будете вынуждены использовать reinterpret_cast так или иначе.

На практике я использую reinterpret_cast, потому что это является более описательным из намерения операции броска. Вы могли, конечно, изложить доводы для различного оператора для обозначения указателя, дает иное толкование только (который гарантировал тот же возвращенный адрес), но нет один в стандарте.

7
ответ дан Nick 23 November 2019 в 06:06
поделиться

I suggest using the weakest possible cast always.

reinterpret_cast may be used to cast a pointer to a float. The more structure-breaking the cast is, the more attention using it requires.

In case of char*, I'd use c-style cast, until we have some reinterpret_pointer_cast, because it's weaker and nothing else is sufficient.

0
ответ дан 23 November 2019 в 06:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: