1

このようなコードが欲しい...

static linked_list* globalListHoldingAllSortsOfGoodies = initialize_linked_list();

/* [In a different file...] */
static int placeholder = add_to_global_list(goodies);

ただし、非定数の初期化は C では不可能です。

C89を壊さずに同じ効果を得る方法はありますか?

ポイントは、プレースホルダーも使用するマクロでグッズを宣言することにより、さまざまなものをグローバル リストに「自動的に登録」することです。

4

4 に答える 4

4

静的データからリンク リストを作成できます。ANSI C89 (別名 ISO C90) では、次のようになります。

struct node
{
 int data;
 struct node *next;
};

struct node nodes[] = { { 42, &nodes[1] }, { 137, 0 } };
struct node *list = nodes;

ISO C99 (2000 年に ANSI によって採用) では、さらに複合リテラルを使用できます。

struct node *list = &(struct node){ 42, &(struct node){ 137, 0 } };

静的に割り当てられたノードと動的に割り当てられたノードを混在させると、前者を解放すると未定義の動作が発生するため問題があるため、どのノードがどのグループに属しているかを追跡する必要があります。

于 2010-02-10T23:29:43.720 に答える
1

まあ、あなたはplaceholderメソッドでを初期化することができますmain:-)

于 2010-02-10T22:56:33.953 に答える
0

お気づきのように、C にはこの機能がありません。(C コードを生成することによって) C の外部でそれを行うことができない場合は、それを必要とするモジュールごとに initialize() 関数を作成し、関数が適切なタイミングで呼び出されるようにすることもできます。

于 2010-02-10T23:15:37.950 に答える
0

いいえ、そんなことはありません。静的変数を静的データで初期化できます。リストへの追加は「静的」ではありません。ほとんどの人は、ソース ファイルをスキャンし、必要なものを「グローバル リスト」から見つけて、適切なデータ (NULL で終了する静的に初期化されたテーブルなど) を含む .c ファイルを生成するプリプロセッサを作成することだと思います。 .

于 2010-02-10T22:55:33.397 に答える