1

あるテーブルが元のテーブルを参照する別のテーブルを参照するという静的テーブルの問題を回避しようとしています。コンパイラは、テーブル メンバーの 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 に答える