我正在尝试避免在静态表中出现问题,其中一个表引用另一个表引用原始表。编译器抱怨找不到表成员之一的定义。为了解决该问题,我一直在模拟一些测试代码,这些方法是否行得通?像我正在尝试做的事情是否可能?
以下是供参考的代码:
#define SWIZTBLMAX 256
#define TERM( NAME , ...) \
static cli_term NAME { __VA_ARGS__ }; swizzle_tbl[__COUNTER__] = { &NAME, "NAME" };
typedef struct cli_term
{
char* name;
cli_term* parent;
cli_term* child;
}cli_termt;
typedef struct swiz_ent
{
cli_term* t;
char* n;
}swiz_ent;
static swiz_ent swizzle_tbl[SWIZTBLMAX];
static cli_term* swizzle(const char* n)
{
int i;
for(i=0;i<SWIZTBLMAX;i++)
{
if(strcmp(n,swizzle_tbl[i].n)==0)
return swizzle_tbl[i].t;
}
return NULL;
}
TERM( ct_show_test, "test", swizzle("ct_show"), NULL )
TERM( ct_quit, "quit", NULL, NULL )
TERM( ct_show, "show", NULL, swizzle("ct_show_test") )
因此,我的想法是将指针分配推迟到运行时,在将对象写入磁盘和回写时,我做过类似的事情。有什么办法可以创建这样的静态表?(带有指向静态分配的其他结构的指针)
您的TERM宏不能在函数范围之外使用,因为它会尝试编写赋值而不是声明:
#define TERM( NAME , ...) \
static cli_term NAME { __VA_ARGS__ }; \
swizzle_tbl[__COUNTER__] = { &NAME, "NAME" };
的swizzle_tbl[__COUNTER__]
是一个赋值; 您不能在函数外部进行分配。还必须升级它以分配复合文字:
#define TERM( NAME , ...) \
static cli_term NAME { __VA_ARGS__ }; \
swizzle_tbl[__COUNTER__] = (swiz_ent){ &NAME, "NAME" };
用TERM
一个函数内部可能会或可能不会帮助; 静态cli_term
变量只能通过外部访问swizzle_tbl
。这可能是一件好事。如果其他都可以(不需要通过名称访问数据),则应该可以。
您需要考虑做什么__COUNTER__
。它不是标准C的一部分,因此不可移植。您可以在函数中使用局部变量代替__COUNTER__
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句