C++の呼び出し元のために翻訳する必要があるDSLに由来するコードがいくつかあります。 #include依存関係をC++でどのようにソートするかを理解する必要があります。幸いにも、私は自分の仕事をより簡単にできるいくつかの制限があります。C++の#include依存関係を自動的にソート
- 結果にテンプレートやマクロが含まれていません。私は人生を楽にするためにテンプレートやマクロを使うことができますが、DSLはそれらを必要とするものを明示的に生成しません。すべての前処理、コード生成はそのために行われます。
- 結果のコードは、読み込み可能または保守可能である必要はありません。プログラムによって生成され、消費されることになります。好ましくは、パフォーマンス上の罰則を伴わないか、オプティマイザを混乱させることはありませんが、それが必要ならば私は生きることができます。
しかし、私は法的C++なプログラムを記述するいくつかのコードを変換する必要がありますが、そのようなこれまでのところ、私は私が作るでしょうアイデアを思い付いた
struct X {
Y y;
Y func();
};
struct Y {
X func();
};
// or
struct Y {
void func(X x);
};
struct X {
void func(Y y);
};
として、定義されることはありません各タイプは独立したヘッダを持ちますが、実装ファイルでは実装が依存するすべての型を#includeできますが、これはあまり難しくありません。問題は、これが可能になるようにXとYのコードをどのように変更できるかです。
今、私はRVOとNRVOを適用し、議論のために幾分似通ったことをすることを考えました。しかし、実際には最適化ではなく、実際には可能でないケースはありませんか?これはMSVC10で書かれているので、C++ 0xが提供する追加機能に対処できます。
編集:自分のニーズを少し控えめにしているので、自分のコードを編集しました。 RVOとNRVOもこれをカットすることはできません。
編集編集:関数の戻り値と引数で前方宣言で十分であれば、データメンバーのインクルード注文をトポロジカルに並べ替えることができます。結局のところ、何かをすることはまだ合法ではない
struct X {
Y y;
};
struct Y {
X x;
};
エラーC2079: 'X :: y'は未定義の構造体 'Y'を使用します。不完全な型は完全に定義された型のように使用することはできません。両方の提案されたヘッダーがエラーになります。 – Puppy
@DeadMG [OK]を、私はそれらの型を使用してインラインコードは、コンパイラが言うもののために動作しないことを述べている必要があります。ヘッダファイルに実際に関数本体がある場合は、使用する型の完全宣言を含めるか、それらの本体をcppファイルに移動する必要があります。 – Fiktik
@DeadMGまた、いくつかのコードでタイプAを使用する場合は、headerA.hとheadedB.hの両方を明示的にインクルードする必要があります。 – Fiktik