循環リンクが必要な C/C++ データ構造を静的に定義するための最もよく知られた方法を探しています。たとえば、子と親の両方が相互へのポインターを必要とするツリー。
extern struct Op op_subops[4]; // fwd ref to children of ops
struct Op
{
const char *name;
struct Op *parent;
struct Op *children;
};
struct Op ops[128] = {
{"op",0,&op_subops[0]}
};
struct Op op_subops[4] = {
{"subop1",&ops[1],0},
{"subop2",&ops[1],0}
};
上記はコンパイルされます (g++ 5.2)。キーワードにより、からへextern
の前方参照を作成できるように思われます。また、逆の方向は、先行するため、自然に機能します。ops
ops_subops
ops
ops_subops
私が気に入らないのは、両方の配列がそうであることを好むということですstatic
(オブジェクトファイルに公に見えるシンボルを作成しないでください)。
方向の 1 つに整数インデックスを使用することもできますが、それはちょっとばかげているように思えます。リンカにアドレスを解決してもらいたいだけです。
これを機能させるための魔法のキーワードを持っている人はいますか?
ありがとう!
編集: C++ 静的コンストラクターや最先端の C++17 拡張機能などを避ける必要があります (悲しいことに)。そして、私のアプローチはプラットフォームに依存しない必要があります。