Why do you say C has no type safety? Only way around the type system is void, explicit casts and I guess unions.
It admittedly doesn't have a very advanced type system, that's true.
It admittedly doesn't have a very advanced type system, that's true.
And typedefs. Given that there's no parametric types, you run into void* quite frequently as well, so saying "only" inaccurately minimizes the scale of how much C code isn't strictly type safe.
And may I ask why you say "typedef" is unsafe? It is merely a type alias, like e.g. Haskell's and ML's "type", or isn't it?
It is, but it freely allows conversion between the aliased types.
typedef int Feet;
typedef int Meters;
int main() {
Feet height = 6;
Meters inEngland = height; // <-- OK. :(
}λ> :{
Prelude| type Feet = Int
Prelude| type Metres = Int
Prelude| :}
λ> let a = 5 :: Feet
λ> let b = 4 :: Metres
λ> :t a
a :: Feet
λ> :t b
b :: Metres
λ> a + b
9
λ> let f = id :: Feet -> Feet
λ> f b
4