- C++14/C++1z 20
603 :デフォルトの名無しさん[sage]:2015/07/11(土) 14:27:22.00 ID:I825HQOD - 関数のプロトタイプ宣言を不要にすることは出来るけど、
C++のスタイルを維持するのであれば、厳しい条件があるね。 それは、「1コンパイル単位内であれば」、出きる、ということ。 例えば一つのcppファイル内であれば、関数のプロトタイプ宣言を無しにすることも可能。 ただし、現状の規格はそうはなってないが。 あちこちのcppファイルに実装が散らばっている状況なら原理的に無理。 だ・か・ら、 「今だってクラス内であればメンバ変数/関数順番関係なしに書いて使えるし」 ということになってる。 クラス定義は、絶対に1コンパイル単位内に収まるから、 その中であれば順不同でもOKってことになってる。
|
- C++14/C++1z 20
612 :デフォルトの名無しさん[sage]:2015/07/11(土) 22:18:19.84 ID:I825HQOD - >>610
分割コンパイルするからそうはいかない。 a.cppコンパイル中はb.cppのことは忘れてる。
|
- C++14/C++1z 20
617 :デフォルトの名無しさん[sage]:2015/07/11(土) 23:18:59.54 ID:I825HQOD - ともかく、今の文法では無理。
C++は構造体のメンバに他の構造体の実態を持てるので。これが痛い。 コンパイル時に構造体のサイズを計算するとき、 互いのファイルで相互依存が有った場合、問題が出る。 a.cpp---------------------------------------- struct a_outer{ file_b_inner member; }; struct a_inner{ int member; }; b.cpp---------------------------------------- strcut b_outer{ file_a_inner member; }; struct b_inner{ int member; }; a.cpp b.cpp どちらを先にコンパイルしても問題が起こる。 こういうことが起こりうる言語で、前方宣言を許すために依存関係を調べてコンパイル順を 自動化するのは無謀。突然「依存関係エラー」とか言われても、エラーの意味が大きすぎる。 自動化できないならマニュアルで行くしかない。
|
- C++14/C++1z 20
618 :デフォルトの名無しさん[sage]:2015/07/11(土) 23:28:53.50 ID:I825HQOD - 訂正
a.cpp---------------------------------------- struct a_outer{ b_inner member; }; struct a_inner{ int member; }; b.cpp---------------------------------------- strcut b_outer{ a_inner member; }; struct b_inner{ int member; }; 前方宣言を許すために >> 前方宣言を無くすために
|
- C++14/C++1z 20
619 :デフォルトの名無しさん[sage]:2015/07/11(土) 23:56:25.53 ID:I825HQOD - >>605 も 「クラス定義の中での前方参照も、型はダメとか中途半端なので、」
と書いているように、クラスや構造体のサイズ問題は色々と足を引っ張る。 型の前方参照がダメなのは、型のメンバ変数の定義に依存関係が出ると、サイズの決定が面倒なことになるから。 ちなみに、class a; と前方宣言しておくと、ポインタなら持てるようになる。 それから、メソッドの中で型をインスタンス化したりは問題ない。依存関係が発生しないので。メンバに持とうとすると怒られる。 よく考えられているギリギリの攻めの仕様だね。 コンパイラの都合を考えない人からすれば、まったく意味不明な仕様だが。
|