有没有办法保持全局变量只能从库内部看到,而在C中访问该库的程序无法访问?
并不是保持变量受保护是至关重要的,但如果程序无法导入它,我宁愿它,因为它不是他们的业务.
我不关心涉及宏的解决方案.
如果使用g ++,则可以使用链接工具来使用属性.
__attribute__((visibility("hidden"))) int whatever;
Run Code Online (Sandbox Code Playgroud)
您还可以将所有内容标记为隐藏,并使用此标记明确标记可见内容:-fvisibility = hidden
然后用以下标记可见变量:
__attribute__((visibility("default"))) int whatever;
Run Code Online (Sandbox Code Playgroud)
static int somelocalvar = 0;
Run Code Online (Sandbox Code Playgroud)
这使得somelocalvar只能从声明它的源文件(参考和示例)中看到.
在库实现中,声明你的变量:
struct my_lib_variables
{
int var1;
char var2;
};
Run Code Online (Sandbox Code Playgroud)
现在在最终用户的标题中,声明它是这样的:
struct my_lib_variables;
Run Code Online (Sandbox Code Playgroud)
它将结构声明为不完整类型.将使用标题的人将能够创建指向结构的指针,但这就是全部.目标是他们必须写下这样的东西:
#include "my_lib.h"
struct my_lib_variables* p = my_lib_init();
my_lib_do_something(p);
my_lib_destroy(p);
Run Code Online (Sandbox Code Playgroud)
libray代码能够修改变量,但库不能直接执行.
或者您可以使用全局变量,但将extern声明放在标题中,最终用户不会使用它.