Альтернатива переменным-членам в C - PullRequest
1 голос
/ 20 мая 2011

У меня есть файл с несколькими связанными функциями, которым нужно поделиться частью данных.Хотя я хотел бы избежать использования глобальной переменной, лучшее решение, которое я могу придумать, - это объявить статический файл, но я бы хотел ограничить область действия файлом.Я думаю, что это можно сделать с помощью объявления static.Существуют ли другие, превосходящие альтернативы?

В объектно-ориентированной среде они все будут членами класса.

Ответы [ 4 ]

4 голосов
/ 20 мая 2011

Хотя статика будет работать, я думаю, что вам действительно нужна структура.Каждая функция будет принимать эту структуру в качестве параметра.Так что-то вроде:

typedef struct mystruct_s {
    ...
} mystruct_t;

void myfunc1(mystruct_t *mystruct);
void myfunc2(mystruct_t *mystruct);

Одним из преимуществ этого подхода является то, что он поточно-ориентированный.то есть, вы можете иметь несколько экземпляров mystruct, работающих одновременно.Это также чище, чем иметь то, что по сути является глобальной переменной (даже если она ограничена в области действия одним файлом).

3 голосов
/ 20 мая 2011

Нет, объявление глобальной статической переменной в значительной степени охватывает то, что вам нужно сделать (при условии, что переменная должна измениться; в противном случае используйте макрос).Вы можете объявить статическую переменную на глобальном уровне и сделать ее закрытой для файла.

Кроме того, имейте в виду, что она абсолютно не поточна.

2 голосов
/ 20 мая 2011

A static ограничит область действия файлом, но будет только одна из них.Это означает, что вы можете когда-либо иметь только одного пользователя из этого набора функций, если в этом есть какое-либо состояние.

Лучше иметь дескриптор с жизненным циклом, который вы могли бы охватить, как бы вам ни понадобилось.То есть:

Foo * handle = foo_create();  // Allocates and initializes a structure

foo_operation1(handle);
foo_operation2(handle);

foo_destroy(handle);          // Deallocates the structure

Это гарантирует, что только код, который знает о handle, сможет сделать все, что его изменит.

1 голос
/ 20 мая 2011

static ограничит область действия текущей компиляцией (файлом). Но это глобальная декларация. Альтернативой является передача объекта из функции в функцию в качестве параметра. Это довольно часто.

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