2012-03-29 10 views
0

counterdistanceは、ボンネットの下に両方のintているにもかかわらず、彼らは現実の世界に互換性のない型を表すため、このコードは無効になりますどこの言語が存在する場合は基本的に、私は疑問に思う:ハンガリー語アプリの言語は?

#include <stdio.h> 

typedef int counter; 
typedef int distance; 

int main() { 
    counter pies = 1; 
    distance lengthOfBiscuit = 4; 

    printf("total pies: %d\n", pies + lengthOfBiscuit); 

    return 0; 
} 

でコンパイル「gcc -pedantic -Wall」と私が試した他のすべての言語に関する警告はありません。誤ってカウンタと距離を追加するのを許可しないようにするのは良い考えですが、言語サポートはどこですか?

(ちなみに、この質問を促した実際の例は、PHPとPythonのWeb開発者の仕事でした。「HTMLエスケープ文字列」、「SQLエスケープ文字列」、「生危険なユーザー入力"互換性はありませんが、私が得ることができる最善の方法は、ここに示唆されているようなハンガリー語の表記です - >http://www.joelonsoftware.com/articles/Wrong.html < - それでもコンパイラのサポートではなく人間のチェック("間違ったコードは間違って見える ")に依存しています(" wrong code is wrong "))

+0

どのようにユーザー定義型を許可する静的型言語ですか?もちろん、クラスラッピングなど。 "これは距離です"という情報を追加するだけの整数は、定義するためのかなりの型付けと使用するPITAです。しかし、それは全体のポイントと思われる。 – delnan

+0

実行時にチェックされたユーザー定義型および実装済基本型を使用して完全に行うことができます。あなたが言うように、それは非常に長持ちする方法です - Cのtypedefは例のように構文には完全にぴったりですが、私は自動的に型間を静かにキャストしないでコンパイル時エラーをスローします... – Shish

答えて

0

Adaでは、同じ表現を使用するタイプを使用できますが、依然として異なるタイプです。どのような "強力なtypedef"(存在する場合)CまたはC++であろうか。あなたのケースでは

、あなたは整数のように振る舞うが、混在させることはできません二つの新しいタイプを作成するために

type counter is new Integer; 
type distance is new Integer; 

を行うことができます。

Derived types and sub types in Ada

+0

グッドフレーズの強いtypedefについて言及していただきありがとうございます。グーグルにそれを固執することで、トピックに関する多くの有用なディスカッションが行われました(主に、特定の言語で実行できるかどうかを尋ねる人々や、アイデア...) – Shish

0

メンバ変数に厳密な型をラップするオブジェクトを作成し、その型に意味をなされる操作(関数の形であっても)を定義することができます(LEngthは" plus "を定義します別の長さ、角度については)。

このアプローチの欠点は、気になる基礎となるタイプごとにラッパーを作成し、それぞれの合理的な組み合わせに対して適切な操作を定義する必要があることです。これは退屈でエラーが発生する可能性があります。

C++では、dimensionsのBOOSTサポートをチェックすることができます。与えられた例は、主に物理的な次元のために設計されていますが、他の多くの人にも適用できると思います。

1

Haskellは、これを行うことができGeneralizedNewtypeDerivingであなたが必要なものだけを露光しながら、根底にあるものとしてラップの値を扱うことができます。

{-# LANGUAGE GeneralizedNewtypeDeriving #-} 
newtype Counter = Counter Int deriving Num 
newtype Distance = Distance Int deriving Num 

main :: IO() 
main = print $ Counter 1 + Distance 2 

は今、あなたはエラーを取得する:

Add.hs:6:28: 
    Couldn't match expected type ‘Counter’ with actual type ‘Distance’ 
    In the second argument of ‘(+)’, namely ‘Distance 2’ 
    In the second argument of ‘($)’, namely ‘Counter 1 + Distance 2’ 

"強制"を使用して、または明示的にIntsをアンラッピングして、基になるデータ型を強制することはできます。

「本当の」タイプの言語であれば、これを行うことができるはずです。

関連する問題