- ベストアンサー
CおよびC++におけるtypedefの厳密な扱われ方
お世話になっております。 主に3D系のゲームプログラマをしている者です。 今更こんな基本的な事を聞くのもお恥ずかしいのですが、出来るだけ正確な確認をしたいので、 皆様のお力を借りれたらと思います。 知りたい部分は、typedefで型再定義された物は、 元の型と全く同じ型として扱われると思って問題ないのか。 と言う事です。 typedefは、型の同義語を作る。 とあり、型名を簡略化する目的で使用されるのが一般的な使われ方ですが、型の同義語。 と言うのは、完全に、同じ型ではあるが名前だけが違う。と言う別名定義(defineの如く)として 見て良いのでしょうか? 例えば、 typedef int INT_A; void func (int param); /* 通常のintで仮引数を取る */ int main(void) { INT_A num = 0; /* 再定義したINT_Aで変数を宣言し */ func(num); /* 通常intの仮引数にINT_Aで引数を渡す */ return 0; } 等とした場合、問題ないでしょうか。 特に問題ない事は幾つかの処理系で確認していますし、自身問題ないだろうと思っていますが、 厳密に言えば推測の域を出ないので困っています。 参考書やネット、経験からの勝手な推測では、defineならプリプロセッサにより、 コンパイル前にテキストレベルでの置き換えが行われるので同一。 typedefはコンパイル時解釈とあるので、同じ型と解釈して、 オブジェクトファイル等のバイナリレベルに落とす際に同一物にしてしまう。 等の変換を処理系で行っているのなら、同一なのかな。等と思っています。 (私は処理系の開発等はした事がありませんし、知識もソフ開レベル程度があるだけです) また、上記コードはC/C++どちらでも適用出来ますが、 C++はCと比べ、型の違いをより厳密に見ると聞きます。 ネットや参考書、経験則と言った類からの意見ですと質問した意味が ありませんので、 なるべくなら、X3010および、X3014(ANSIやISOも可)の規格から見て、上記の様な コードが全く問題ないのかどうか、ご教示頂けると幸いです。 (私は規格を持っていませんので・・・) また、上の例はサンプルであり、使い方等におけるコードの 可読性や意義に関しては、ここでは別問題とします。 以上、宜しくお願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
>X3010および、X3014(ANSIやISOも可)の規格から見て、 日本工業標準調査会のホームページで 無料でWEB観覧できますので自分で見た方が良いかも。 ちなみにX3010では以下のように明記されています。 X3010 6.7.7 typdef宣言は新しい型を導入するのではなく、 指定した型の同義語だけを導入する。
- 参考URL:
- http://www.jisc.go.jp/
その他の回答 (1)
- jacta
- ベストアンサー率26% (845/3158)
> 元の型と全く同じ型として扱われると思って問題ないのか。 その認識で問題ありません。
お礼
いつもお世話になっております。 返答ありがとうございました。
お礼
ありがとうございます。 だいぶ前にネットで規格を確認しようとした所、見れなかったので、 見れない物と思い込んでおりました。 (多分社内サーバの不調とかが原因だったのでしょうが) Cの規格、該当箇所を確かに確認致しました。 >typdef宣言は新しい型を導入するのではなく、 >指定した型の同義語だけを導入する。 と言う文面から、やはり問題ないと考えて差し支えないと判断します。 また、X3014でC++の方も探しましたが、7.1.3にtypedefの記述を 確認しました。一部省略しつつ抜粋すると、 ・typedef指定子をもつ<宣言>は、<識別子>を宣言し、後で基本型、 または複合型を名指すことができるようにする。 ・typedef指定子によって宣言された名前は、<型定義名>となり、 その宣言の有効範囲内では、構文規則上ではキーワードと同等と し、その識別子に結びついた型を名指す。 ・型定義名は、クラス宣言又は列挙体宣言とは異なり、新たな型を 作り出しはしない。 等があり、自分の認識と同じである事を再確認致しました。 スッキリしました。有り難うございました。 (しかし、C90やC95の規格は相当前に無くなってしまいましたね。 どうせなら、C99以前の規格も拝見してみたいのですが・・・)