Почему typedef не являются строго типизированными?

По какой причине typedefs не является строго типизированным? Есть ли какая-то выгода, которую я не вижу, или это связано с обратной совместимостью? См. этот пример:

typedef int Velocity;
void foo(Velocity v) {
    //do anything;
}
int main() {
    int i=4;
    foo(i); //Should result in compile error if strongly typed.
    return 0;
}

Я не прошу обходных путей для получения строго типизированного типа данных, а только хочу знать, почему стандарт не требует строгой типизации typedefs?

Спасибо.


person halex    schedule 18.11.2011    source источник
comment
Потому что C — это язык для людей, которые хотят добиться цели, а не для людей, которые хотят обдумать математическую красоту систем абстрактных типов. (Как человек, который ценит оба занятия, я не осуждаю ни одно из них).   -  person Stephen Canon    schedule 18.11.2011
comment
@Stephen Canon: Кто сказал, что системы абстрактных типов не могут помочь вам добиться цели? Отладка ошибок во время выполнения, возникающих в результате случайного неправильного использования типов, определенно не считается в моей книге «Как привести дела в порядок».   -  person Michael Borgwardt    schedule 18.11.2011
comment
@MichaelBorgwardt: я, конечно, не говорил, что они не могут. Однако ими могут злоупотреблять.   -  person Stephen Canon    schedule 18.11.2011


Ответы (3)


Потому что C не является строго типизированным, и typedef берет свое начало в этом мышлении.

typedef предназначен только для удобства и удобочитаемости, он не создает новый тип.

person AndersK    schedule 18.11.2011

typedef — это просто неправильное название (как и многие другие ключевые слова). Думайте об этом как typealias.

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

person Jens Gustedt    schedule 18.11.2011
comment
Разве основная идея языка C не состоит в том, что это всего лишь кусочки, не будем слишком это скрывать? - person Michael Borgwardt; 18.11.2011
comment
@MichaelBorgwardt, нет, я так не думаю. В противном случае у него не было бы этой подробной модели совместимых типов. - person Jens Gustedt; 18.11.2011

Даже если бы Velocity был типом, отличным от int, ваш код скомпилировался бы и работал нормально благодаря правилам преобразования типов. Что не сработает, так это передача выражения типа Velocity * в функцию, ожидающую int *, и т. д. Если вы хотите добиться последней формы принудительного применения типа, просто сделайте Velocity структурой или типом объединения, содержащим одно целое число, и теперь у вас будет новый реальный тип.

person R.. GitHub STOP HELPING ICE    schedule 18.11.2011