【发布时间】:2017-03-13 20:49:07
【问题描述】:
我正在寻找最好的方法来静态定义需要循环链接的 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(不在目标文件中创建公开可见的符号)。
我可以为其中一个方向使用整数索引,但这似乎有点做作,我宁愿让链接器为我解析地址。
有人有一个神奇的关键字来完成这项工作吗?
谢谢!
编辑:我需要避免使用 C++ 静态构造函数和前沿 C++17 扩展(遗憾的是)。而且我的方法需要独立于平台。
【问题讨论】:
-
这是 C 还是 C++?您对
struct X* member;的使用表明您可能需要一个纯 C 的解决方案。 -
没有语言“C/C++”。选一个。您正在使用类似 C 的代码,但使用 g++ 进行编译,这让我对您真正感兴趣的语言感到困惑。
-
在您询问静态定义数据结构的地方,似乎您实际上可能在询问初始化。在那种情况下?
-
@JohnBollinger 不,他想要静态数据而不是全局数据,因此它们在其他编译单元中不可见。如果他把静态,他不能再“向前”定义为外部。
-
@Christophe,这些不是相互排斥的。如果默认初始化是可以接受的,那么在 C 中声明所有
static是没有问题的。也许 C++ 中的情况有所不同,但 OP 想要避免一组模糊指定的 C++ 特性。
标签: c++ arrays linker static-allocation