Альтернатива переменным-членам в C

#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 ограничила бы область действия текущей компиляцией (файлом). Но это глобальное объявление. Альтернативой является передача объекта из функции в функцию в качестве параметра. Это довольно распространенное явление.