1

我试图避免静态表中的一个问题,即一个表引用另一个引用原始表的表。编译器抱怨找不到表成员之一的定义。为了解决这个问题,我一直在模拟一些测试代码,这些方法会起作用吗?像我正在尝试做的事情甚至可能吗?

以下是供参考的代码:

#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") )

所以,我的想法是将指针分配推迟到运行时,我在将对象写入磁盘和返回时做了类似的事情。有什么办法可以创建这样的静态表吗?(带有指向静态分配的其他结构的指针)

4

2 回答 2

2

您可以通过在定义变量之前声明变量来在全局变量中进行循环引用:

struct foo {
    struct foo *fooptr;
};

extern struct foo variable1;
extern struct foo variable2;

struct foo variable1 = { &variable2 };
struct foo variable2 = { &variable1 };
于 2015-03-20T23:32:25.097 回答
1

您的 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__.

于 2015-03-20T23:41:52.180 回答