使C模块变量可以只读方式访问

Gau*_*ier 8 c readonly

我想为模块变量提供客户端模块的只读访问权限.几种解决方案

1.最常见的一个:

// module_a.c
static int a;

int get_a(void)
{
    return a;
}

// module_a.h
int get_a(void);
Run Code Online (Sandbox Code Playgroud)

这使得每个变量共享一个函数,一个函数调用(我正在考虑执行时间和可读性),每次读取都有一个副本.假设没有优化链接器.

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
Run Code Online (Sandbox Code Playgroud)

我喜欢这样,除了客户端需要读取指针内容的事实.此外,每个只读变量都需要其extern const指针const.

3.受第二个解决方案启发的第三个解决方案是隐藏结构后面的变量和结构的外部指针.module_name->a在我看来,符号在客户端模块中更具可读性.

4.我可以为函数创建内联定义get_a(void).它仍然看起来像客户端模块中的函数调用,但应该进行优化.

我的问题:

  • 是否有一种最佳方法可以在模块中修改变量,在其他模块中只读为只读模块?最佳方面是什么?

  • 您接受或拒绝使用上述哪种解决方案?为什么?

我知道这是微观优化 - 我可能没有实现它 - 但我仍然对这种可能性感兴趣,最重要的是知道.

Ioa*_*oan 5

关于选项#4,如果在实现文件之外无法访问该变量,我不确定是否可以使其内联.我不认为选项#2和#3是真正的只读.指针可以抛弃常量并进行修改(const只是编译器"警告",没有具体内容).只有选项#1是只读的,因为它返回一个副本.

  • 如果你的用户正在丢弃你的`const`,那么他们为什么不通过扫描调试器的符号表来解决你的`static`变量呢?在C中没有"具体"只读. (2认同)