3

ここの語彙はよくわかりませんが、理解できるようになれば幸いです。

私は C++ の堅固な知識を持っていない状態で winapi を使用しているため、多くの typedef を見つけました。これは、私にとって、問題を過度に複雑にし、覚えておかなければならないことがもう 1 つ追加されているように思われます。

たとえば、 のUINT代わりにunsigned intHBITMAPこれはただの であることが判明しHANDLE、その他にも多数あります。

私の質問は、可能な場合は型のより一般的なバージョンに置き換えて、必要なときにキャストダウンすることができますか?

たとえば、私は書きたい

  • void SomeFunction(unsigned int some_int) { ... }それ以外のvoid SomeFunction(UINT some_int) { ... }

  • HANDLE hBMP = LoadImage(...); ImageList_Add(... (HBITMAP) hBMP ...);それ以外のHBITMAP hBMP = ...

これは初心者にとって良いことですか、一般的に悪い習慣ですか、それとも何ですか?

4

5 に答える 5

6

typedef明らかなこと(つまりUINTfor )はしないでくださいunsigned int。むしろ、typedef意味を伝えるために。UINTよりも優れていませんunsigned int(短いと主張する人もいるかもしれませんが、真剣に、それほど短くはありません)。

typedeffor 長い名前 ( for のようなtypedef)はstd::map<unsigned int, flost>::const_iterator、読みやすさが向上するため、私の意見では問題ありません。UINT... それほどではありません。

typedef特定のタイプ/用途 ( など) の特定の意味を伝えるための AHANDLEは適切です。私の意見では、 a) が a かどうかは気にしない、b) その目的を伝えるため、 HANDLEraw を使用するよりも優れています。void*HANDLEvoid*

for 移植性は( typedef32 ビット符号付き整数の typedef のように) 優れており、プラットフォーム/コンパイラ間の移行が容易になります。

于 2012-11-28T05:48:05.747 に答える
4

これは初心者にとって良いことですか、一般的に悪い習慣ですか、それとも何ですか?

それは悪い習慣です。実際の型は使用しないでください。

typedef は通常、さまざまなプラットフォームおよびコンパイラの実装での移植性を目的としています。そのため、typedef された名前の代わりに実際の型を使用することは控えてください。実際の型を使用すると、使用するプラットフォームとコンパイラの実装にコードがより緊密に結合されます。実際、この組み合わせが変わると、正しく機能しない可能性があります。

また、typedef 名は実際の型よりも直感的であり、プログラマーに広く知られています。

于 2012-11-28T05:48:31.143 に答える
2

Typedefs移植性だけでなく、将来の保証にも役立ちます。MicroSoftがある時点で、それをではなくのために使用するUINT必要があると判断した場合は、を使用することで、コードが引き続き機能することを確認できます。この種の変更は、特にMSのような大企業のコードではほとんどあり得ませんが、その考えは依然として当てはまります。多くの種類の抽象化に適しています。それらは決して悪いことではありませんが、時々悪い使用法の例を見つけることができます。他の人のAPIを使用している場合は、常にその人のAPIを使用してください。彼らはおそらく抽象化の正当な理由があります。typedefunsigned long intunsigned intUINTtypedefstypedefs

于 2012-11-28T10:20:07.073 に答える
1

typedefを使用する理由はいくつかあります。

  1. いくつかのタイプの省略形:typedef unsigned int UINT
  2. 移植性:typedef int INT64
  3. 読みやすさ:typedef HANDLE HBITMAP

より具体的にすることでコードの読者を助けることができ、リスコフの置換原則に従ってインスタンスを使用できるため、ここでは何も失われないため、(一般的に)記述しないのと同じ理由で読むHBITMAP hBitmap = ...よりも読みたいですインスタンスを使用できる場所ならどこでも。HANDLE hBitmap = ...Animal dog = new Dog()dogAnimal

BoostでC++を使用している場合は、使用を検討することもできます。これにより、基本的に単純なクラスが作成されるため、実際の新しい型が得られます(つまり、とBOOST_STRONG_TYPEDEFのように用途を混在させることはできません。HANDLEHBITMAP


タイプが同一であるため、キャストとして説明するのは実際にはキャストではなくtypedefエイリアスを作成するだけで、新しいタイプは作成しません。だから、書く

HANDLE hOtherBitmap = /* some code */;

HBITMAP hBitmap = (HBITMAP) hOtherBitmap;

書くようなものです

int i = /* some value */;

int k = (int) i;

于 2012-11-28T10:21:47.843 に答える