2

もちろんint、 とlongが同じ型であるとは限りませが、Windows などのプラットフォームで 32 ビット モードでコンパイルすると同じサイズになる場合、コンパイラはそれらを同じ型と見なすことができますか?

コンパイラが 2 つの型を同じと見なすかどうかを決定的にテストする方法がわかりませんが、ヒューリスティック テストを試してみましたがint *a; long *b = a;、Microsoft コンパイラはこれを問題なく受け入れますが、GCC は警告を出します。コンパイラが不適切に動作しているのでしょうか、それとも実装に依存して、2 つの異なる型を指定するのか 1 つだけを指定するのでしょうか?

4

2 に答える 2

5

標準 (C2011 標準の N1570 ドラフト) は、6.2.5 (4) で次のように述べています。

signed charshort intint、 、として指定された 5 つの標準符号付き整数型がlong intありlong long intます。(これらの型およびその他の型は、6.7.2 で説明されているように、いくつかの追加の方法で指定できます。)実装定義の拡張符号付き整数型も存在する場合があります。標準および拡張の符号付き整数型は、まとめて符号付き整数型と呼ばれます。

同項の第 14 段落では、次のように述べています。

char、符号付き整数型と符号なし整数型、および浮動小数点型をまとめて基本型と呼びます。基本型は完全なオブジェクト型です。実装で 2 つ以上の基本型が同じ表現を持つように定義されている場合でも、それらは異なる型です。

つまり、intlong(別の指定方法long int) は異なるタイプです。表現、動作、アライメントの要件は同じかもしれませんが、言語に関する限り、それらは同じ型ではありません。

于 2013-02-14T12:22:02.147 に答える
3

わかりました、C99 標準はセクション6.5.6 タイプで言います:

signed charshort intintlong int、およびlong long intとして指定される5 つの標準の符号付き整数型があります。(これらの型およびその他の型は、6.7.2 で説明されているように、いくつかの追加の方法で指定できます。)実装定義の 拡張符号付き整数型も存在する場合があります。標準および拡張の符号付き整数型をまとめて符号付き整数型と呼びます。

さらに:

char型、符号付きおよび符号なし整数型、浮動小数点型をまとめて基本型と呼びます。実装で 2 つ以上の基本型が同じ表現を持つように定義されている場合でも、それらは異なる型です。

これにより、テンプレートを持たない C で関数のオーバーロードが行われたとしても、それらが異なる型でなければならないことがかなり明確になり、同じ型であるこれらの型が間違いなく多くを壊すC++typeidのように実際にはそれほど重要ではないかもしれませんコード。

編集:実際、 Cの型の区別の実用的な関連性が低く、上記の言語機能がないため、2 つの型の絶対的な区別をすぐにテストする信頼できる方法を思いつくことはできません。

于 2013-02-14T12:24:34.890 に答える