#c #member
#c #Участник
Вопрос:
У меня есть файл с несколькими связанными функциями, которым необходимо совместно использовать часть данных. Хотя я хотел бы избежать использования глобальной переменной, лучшее решение, которое я могу придумать, — это объявить статическую в файле, но я хотел бы ограничить область видимости файлом. Я думаю, что это можно сделать с static
объявлением. Существуют ли другие, более совершенные альтернативы?
В объектно-ориентированной среде все они были бы членами класса.
Ответ №1:
Хотя статика могла бы сработать, я думаю, что вам действительно нужна структура. Каждая функция будет принимать эту структуру в качестве параметра. Итак, что-то вроде:
typedef struct mystruct_s {
...
} mystruct_t;
void myfunc1(mystruct_t *mystruct);
void myfunc2(mystruct_t *mystruct);
Одним из преимуществ этого подхода является его потокобезопасность. т.е. у вас может быть несколько экземпляров mystruct, запущенных одновременно. Это также чище, чем иметь то, что по сути является глобальной переменной (даже если ее область действия ограничена одним файлом).
Комментарии:
1. Это классная идея. Похоже, это потребовало бы, чтобы вызывающие эти функции имели копию указателя, который, я полагаю, мог быть предоставлен вызовом на
mystruct_s* get_mystruct_ptr(){return amp;mystruct_t}
или есть способ, чтобы вызывающие не нуждались в этом?2. Вызывающим пользователям потребуется указатель. Они могли бы создать структуру в стеке, или они могли бы вызвать какой-
create_mystruct()
-то malloc (обратите внимание, что вам понадобится соответствующийdestroy_mystruct()
).
Ответ №2:
Нет, объявление глобальной статической переменной в значительной степени охватывает то, что вам нужно сделать (при условии, что переменную необходимо изменить; в противном случае используйте макрос). Вы можете объявить статическую переменную на глобальном уровне и сделать ее закрытой для файла.
Кроме того, имейте в виду, что это совершенно не потокобезопасно.
Ответ №3:
static
Ограничит область видимости файлом, но тогда будет только один из них. Это означает, что у вас может быть только один пользователь этого набора функций, если задействовано какое-либо состояние.
Лучше иметь дескриптор с жизненным циклом, область действия которого можно изменять по мере необходимости. А именно:
Foo * handle = foo_create(); // Allocates and initializes a structure
foo_operation1(handle);
foo_operation2(handle);
foo_destroy(handle); // Deallocates the structure
Это гарантирует, что только код, который знает о handle
, сможет делать все, что его изменяет.
Ответ №4:
static
ограничила бы область действия текущей компиляцией (файлом). Но это глобальное объявление. Альтернативой является передача объекта из функции в функцию в качестве параметра. Это довольно распространенное явление.