2011-11-18 11 views
6

typedefsが強く入力されないのはなぜですか?見えない、または下位互換性のために何か利点がありますか?この例を参照してください:typedefが強く型付けされていないのはなぜですか?

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を必要とされていない理由を知りたくないですか?

ありがとうございます。

+3

Cは物事を完了したい人のための言語であり、抽象型システムの数学的美を熟考したい人のための言語ではないからです。 (両方の活動に感謝する人として、私はどちらかを判断していない)。 –

+3

@Stephen Canon:誰が抽象型システムは物事を完了するのを助けることができないと言っていますか?間違って誤って使用されたタイプのランタイムエラーをデバッグすることは、私の本のGetting Things Doneとしてカウントされません。 –

+0

@MichaelBorgwardt:私は確かに彼らができないと言っていませんでした。しかし、彼らは虐待される可能性があります。 –

答えて

14

Cは強く型付けされたとのtypedefはその考え

のtypedefにその起源を持っていないので、単に利便性と可読性のために、それは新しいタイプを作成しませんされています。

4

typedefは他の多くのキーワードと同様に、ちょうどミスノマーです。 typealiasと考えてください。

Cは、逆に、互換性のある種類が何であるかの全体的な考え方を持っています。これにより、たとえ関数protopyの宣言が互換性のある型でのみ行われ、同じものではなくても、コンパイル単位を一緒にリンクすることができます。これは、毎日の生活の中で簡単な実用的必要性から来ており、実装に何らかの保証を与えることができます。

+2

Cの主なアイデアは本当に「それはすべてちょっとしたことだよ、それをあまりにも隠してはいけない」って? –

+1

@MichaelBorgwardt、いいえ、私はそうは思わない。それ以外の場合は、互換性のあるタイプのこの詳細なモデルはありません。 –

0

Velocityintと異なるタイプであっても、コードは型変換規則のためにコンパイルされて正常に動作します。何がうまくいかないのは、タイプVelocity *の式を、int *などを期待する関数に渡すことです。タイプ強制の後者の形式を実現するには、Velocityを単一の整数を含む構造体または共用体にするだけです。新しいリアルタイプです。

関連する問題