Ответ 1

По-видимому, я ошибся в своем первоначальном разрезе на ответ. Они примерно эквивалентны. И хотя составные имена типов, такие как long long или void *, не могут напрямую использовать функциональный синтаксис (т.е. long long(val) не работает), использование typedef может обойти эту проблему.

Оба отличных обозначения очень плохие, их следует избегать. Например:

const char c = 'a';
void *fred = (void *)(&c);

работает, и он не должен.

Изначальная нотация C-стиля иногда ведет себя как static_cast, иногда вроде const_cast, иногда вроде reinterpret_cast, или даже комбинация из двух в зависимости от конкретной ситуации, в которой она использовалась. Эти семантики довольно сложны, и не всегда легко точно сказать, что происходит в любой ситуации.

Я перешел к использованию в основном стилей стиля С++ static_cast<type>(val) и никогда не использовал приведения в стиле C. Основываясь на моих исследованиях по этому вопросу, я собираюсь также прекратить использовать функции-стили для чего-либо. Вопрос "стили синтаксиса синтаксиса С++ имеет отличный ответ (принятый), который детализирует почему.

Ответ 2

Вряд ли какая-то разница. Официально первый сообщает компилятору, что это значение является целым числом. Вероятно, это не создает никакого дополнительного кода. Вызов функции - это фактический вызов, который внутренне выполняет другой тип. Интеллектуальный компилятор оптимизирует это, так что они на самом деле одинаковы.

Ответ 3

Нет никакой разницы. Это вопрос предпочтения. Это старомодные приведения

Ответ 4

Это зависит от того, где вы его используете и как. Т.е. если у вас есть значения или указатели (или указатели указателей).

С С++ вы должны читать * _cast < > и использовать их вместо этого.