Делаем переменные модуля C доступными только для чтения

Я хотел бы предоставить переменной модуля доступ только для чтения для клиентских модулей. Несколько решений:

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) . Это все равно будет выглядеть как вызов функции в клиентском модуле, но оптимизация должна иметь место.

Мои вопросы:

  • Есть ли лучший способ сделать переменные, измененные в модуле, доступными только для чтения в других модулях? Лучше всего в каком аспекте?

  • Какие из вышеперечисленных решений вы бы приняли или отказались использовать и почему?

Я знаю, что это микрооптимизация - я не могу ее реализовать - но меня все еще интересует такая возможность, и выше все в знании.

8
задан Gauthier 18 May 2011 в 12:12
поделиться