Статическая инициализация в C - PullRequest
1 голос
/ 11 февраля 2010

Я хочу иметь код, который выглядит примерно так ...

static linked_list* globalListHoldingAllSortsOfGoodies = initialize_linked_list();

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

Но непостоянная инициализация невозможна в C.

Есть ли способ получить такой же эффект, не нарушая C89?

Смысл в том, чтобы разные вещи «автоматически регистрировались» в глобальном списке, объявляя вкусности макросом, который также использует заполнитель.

Ответы [ 4 ]

4 голосов
/ 11 февраля 2010

Вы можете построить связанный список из статических данных. В 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 (принятом ANSI в 2000 г.) вы можете дополнительно использовать составные литералы, например

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

Смешивать статически распределенные узлы с динамически размещенными узлами проблематично, так как освобождение первых приведет к неопределенному поведению, поэтому необходимо будет отслеживать, какие узлы принадлежат какой группе.

1 голос
/ 11 февраля 2010

Ну, вы можете инициализировать placeholder в методе main: -)

0 голосов
/ 11 февраля 2010

Как вы заметили, C не имеет этой возможности. Если вы не можете сделать это вне C (путем генерации кода C), то альтернативой будет создание функции initialize () для каждого модуля, который в ней нуждался, и обеспечение вызова функций в соответствующее время. *

0 голосов
/ 11 февраля 2010

Нет, такого нет. Вы можете инициализировать статические переменные со статическими данными. Добавление в список не является «статичным». Я полагаю, что большинство людей делают, чтобы написать препроцессор, который сканирует исходные файлы, находит то, что вы хотите иметь в «глобальном списке», а затем генерирует файл .c с соответствующими данными (например, статически инициализированной таблицей с нулевым символом в конце) .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...