Fazer variáveis do módulo C acessíveis como somente leitura
Gostaria de dar a uma variável de módulo um acesso somente leitura para os módulos do cliente. Várias soluções:
1. O mais comum:
// module_a.c
static int a;
int get_a(void)
{
return a;
}
// module_a.h
int get_a(void);
@This cria uma função por variável a ser compartilhada, uma chamada de função (estou pensando em tempo de execução e legibilidade) e uma cópia para cada leitura. Supondo que nenhum vinculador de otimização.
2. Outra solução:
// 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
Gosto disso, além do fato de o cliente precisar ler o conteúdo de um ponteiro. Além disso, toda variável somente leitura precisa de seuextern const
ponteiro paraconst
.
3. Uma terceira solução, inspirada na segunda, é ocultar as variáveis por trás de uma estrutura e um ponteiro externo para a estrutura. A notaçãomodule_name->a
é mais legível no módulo cliente, na minha opinião.
4. Eu poderia criar uminline definition para oget_a(void)
função. Ainda pareceria uma chamada de função no módulo cliente, mas a otimização deve ocorre
Minhas perguntas
Existe a melhor maneira de tornar variáveis modificadas em um módulo acessíveis como somente leitura em outros módulos? Melhor em que aspecto?
Quais soluções acima você aceitaria ou recusaria usar e por quê?
Estou ciente de que isso é microoptimização - talvez eu não a implemente -, mas ainda estou interessado na possibilidade e, acima de tudo, no conheciment