Я хотел бы предоставить переменной модуля доступ только для чтения для клиентских модулей. Несколько решений:
1 . Самый распространенный:
// module_a.c
static int a;
int get_a(void)
{
return a;
}
// module_a.h
int get_a(void);
Это делает одну функцию для каждой переменной для совместного использования, один вызов функции (я думаю о времени выполнения и удобочитаемости) и одну копию для каждого чтения. При отсутствии оптимизирующего линкера
2 . Другое решение:
// module_a.c
static int _a;
const int * const a = &_a;
// module_a.h
extern const int * const a;
// client_module.c
int read_variable = *a;
*a = 5; // error: variable is read-only
Мне это нравится, помимо того, что клиенту необходимо читать содержимое указателя. Кроме того, каждой переменной, доступной только для чтения, требуется указатель extern const
на const
.
3 . Третье решение, вдохновленное вторым, состоит в том, чтобы скрыть переменные за структурой и внешний указатель на структуру. Обозначение имя_модуля-> a
, на мой взгляд, более читабельно в клиентском модуле.
4 . Я мог бы создать встроенное определение для функции get_a (void)
. Это все равно будет выглядеть как вызов функции в клиентском модуле, но оптимизация должна иметь место.
Мои вопросы:
Есть ли лучший способ сделать переменные, измененные в модуле, доступными только для чтения в других модулях? Лучше всего в каком аспекте?
Какие из вышеперечисленных решений вы бы приняли или отказались использовать и почему?
Я знаю, что это микрооптимизация - я не могу ее реализовать - но меня все еще интересует такая возможность, и выше все в знании.