5

typedefC++固有のようです(おそらく他の言語で)。値の実際のデータ型が隠されているため、プロジェクトに慣れていない人を混乱させていることがわかりました。場合によっては、タイピングを短くすると便利です。いつ使用することをお勧めしますtypedefか?

また、基になる型を受け入れる関数に typedef された値を渡すことができないことに気付きましたか?

何かのようなもの:

typedef string VAL;
VAL s = "x";
func(string x); // if I try to pass `s`, I get something like no instance of function template match argument list
4

4 に答える 4

4

typedef既存の型から新しい型を作成するために使用される C および C++ 言語ラベルです。最適な場所は、次の例のような構造体を持つ C プログラミング言語で使用するか、既存のプリミティブ型 (short、long など) から新しい、より抽象的な型を作成するために使用することです。

typedef struct {
    int iValue;
    int jValue;
} MyValues;
// declare a variable with this struct
MyValues aMyValuesStruct;

typedef が C に導入される前は、上記の構造体を型として使用するには、次のようにする必要がありました。

struct _MyValuesStruct {
    int iValue;
    int jValue;
};
// declare a variable with this struct
struct _MyValuesStruct aMyValuesStruct;

C++ では、構造体とクラスは、新しい型を作成する同様の構造であるためtypedef、これらの型の変数にはあまり役立ちません。ただし、組み込みのプリミティブ型を使用して他のより抽象的な型を表す場合は、typedef ステートメントを使用すると、より抽象的な方法で型を指定できます。

をこのように使用typedefすると、型のラベルを指定するのが非常に簡単になり、プログラマーがソース コードを読んでいるときに、特定の変数が何を表しているかを理解できるようになります。たとえば、 に適合する色値変数があるunsigned short場合、 を使用しtypedefて色値の新しい型を作成し、それを一貫して使用すると、変数に色値が含まれていることを認識しやすくなり、他の種類のunsigned short.

typedefまた、特定の抽象型が使用されているソース内のすべての場所を見つけるのがはるかに簡単になり、基になる型を簡単に変更できるようになります。たとえば、色の値の型がバイトとして始まるため、 のtypedefような抽象型を作成するために使用し、後でそれを から に変更するtypedef unsigned char ColorValue;必要があることがわかった場合、変更を加える場所が 1 か所あり、型の使用はかなり厳密であり、変更が必要な場所はそこだけです。unsigned charunsigned short

于 2012-11-04T14:43:31.980 に答える
1

場合によっては、タイピングを短くすると便利です。どのような場合に typedef を使用することをお勧めしますか?

良いユースケースの 1 つは、コードベースを編集せずに型を再マップできるようにする場合です。

typedef int32_t pixel_t;

もう 1 つは、コードの使用法がより明確になるように型をより明示的にしたい場合です。

typedef int distance_t;

typedef int angular_momentum_t;
于 2012-11-04T14:31:43.247 に答える
1

あなたの質問は、他の質問で回答されています。

typedefs は、実装の詳細を抽象化するのに役立ちます (C と C++、そしておそらく Objective-C でも?)。型がどのように実装されているかを知る必要のないプログラムの部分に型を隠すことは良い習慣です。これにより、関数に関係のない問題でそのコードが汚染されるのを回避し、型の実装を簡単に変更できるようになります。そのコードを変更する必要があります。

プロジェクトに不慣れな人は、不要な詳細が可能な限り隠されていると、コードに対処するのが実際に簡単になることがあります。

あなたの問題に関してfunc(string x);は、関数呼び出しではなく、関数プロトタイプ宣言です。

于 2012-11-04T14:42:57.430 に答える
0

typedef状況によっては、データを表す基になる型を非表示にするために使用されます。

たとえば、標準では、、またはの一般的なサイズが指定さshort intintlong intいないため、問題になる可能性があります。一方、実装は(現在)、、、および(および場合によってはプラットフォームに応じて)を提供する必要int8_tがあるためint16_t、既知の範囲の値を持つ整数を自由に使用できます。int32_tint64_tint128_t

しかし、何int32_tですか?ええと、それは32ビットの幅の符号付き整数です。それは、、、、または理論のいずれかcharである可能性があります...そしてそれは重要ではありません:それは実装の詳細です。short intintlong intlong long int

したがって、標準ライブラリヘッダーのある時点で、次のように表示されます。

typedef int int32_t; // most likely representation

この定義はプラットフォームを条件としています。

コードで使用するint32_tと、これらの恐ろしいプラットフォームの特性を残して、手元のビジネス、つまりビジネスに集中できます

于 2012-11-04T15:00:24.120 に答える