2011-11-18 15 views
6

¿Cuál es la razón por la que typedefs no está fuertemente tipado? ¿Hay algún beneficio que no puedo ver o es debido a la compatibilidad con versiones anteriores? Vea este ejemplo:¿Por qué no se escribe fuertemente 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; 
} 

yo no estoy pidiendo soluciones para conseguir un fuerte tipo de datos con tipo, pero sólo quiero saber por qué la norma no está requiriendo typedefs ser inflexible?

Gracias.

+3

Porque C es un lenguaje para las personas que quieren obtener cosas hechas, no para las personas que desean reflexionar sobre la belleza matemática de los sistemas de tipo abstracto. (Como alguien que aprecia ambas actividades, no estoy juzgando ninguna). –

+3

@Stephen Canon: ¿Quién dice que los Sistemas de tipo abstracto no pueden ayudarte a hacer las cosas? La depuración de errores de tiempo de ejecución que resultan de tipos accidentalmente mal utilizados ciertamente no cuenta como Getting Things Done en mi libro. –

+0

@MichaelBorgwardt: Ciertamente no dije que no pueden. Sin embargo, * pueden * ser abusados. –

Respuesta

14

Debido a que C no es inflexible y typedef tiene su origen en que el pensamiento

typedef es sólo por conveniencia y facilidad de lectura, que no crea un nuevo tipo.

4

typedef es solo un nombre miserable (como muchas otras palabras clave). Piénselo como typealias.

C tiene, por el contrario, una idea completa de los tipos compatibles. Esto permite, por ejemplo, vincular unidades de compilación, incluso si las declaraciones de función protopyes solo se realizan con tipos compatibles y no con los idénticos. Todo esto proviene de una simple necesidad práctica en la vida cotidiana, y todavía puede dar algunas garantías a las implementaciones.

+2

¿No es la idea principal de C realmente "Todo es solo pedacitos, no lo ocultemos demasiado"? –

+1

@MichaelBorgwardt, no, no lo creo. De lo contrario, no tendría este modelo detallado de tipos compatibles. –

0

Incluso si Velocity fuera un tipo distinto de int, su código se compilaría y funcionaría correctamente debido a las reglas de conversión de tipos. Lo que no funcionaría es pasar una expresión del tipo Velocity * a una función que espera int *, etc. Si desea lograr la última forma de ejecución de tipo, simplemente haga Velocity una estructura o tipo de unión que contenga un entero único, y ahora tendrá un nuevo tipo real

Cuestiones relacionadas