有没有办法让全局变量只能从库内部看到,而在C中访问该库的程序无法访问?
并不是保持变量受保护是至关重要的,但如果程序无法导入它,我宁愿这样做,因为它不属于他们的业务。
我不关心涉及宏的解决方案。
答案 0 :(得分:9)
如果使用g ++,则可以使用链接工具来使用属性。
__attribute__((visibility("hidden"))) int whatever;
您还可以将所有内容标记为隐藏,并使用此标记明确标记可见内容:-fvisibility = hidden
然后用以下标记可见变量:
__attribute__((visibility("default"))) int whatever;
答案 1 :(得分:7)
static int somelocalvar = 0;
使somelocalvar只能在声明它的源文件中可见(reference and example)。
答案 2 :(得分:6)
在库实现中,声明你的变量:
struct my_lib_variables
{
int var1;
char var2;
};
现在在最终用户的标题中,声明如下:
struct my_lib_variables;
它将结构声明为不完整类型。将使用标题的人将能够创建指向结构的指针,但这就是全部。目标是他们必须写出类似的东西:
#include "my_lib.h"
struct my_lib_variables* p = my_lib_init();
my_lib_do_something(p);
my_lib_destroy(p);
libray代码能够修改变量,但是库不能直接执行。
或者您可以使用全局变量,但将extern
声明放在标题中,最终用户不会使用它。
答案 3 :(得分:0)
您可以使用另一个头文件将功能导出到外部模块,而不是内部功能,因此您不必声明不必从模块外部访问的全局变量。
编辑: 如果您多次声明事物,则只有链接器问题。没有必要将所有全局数据保存在一个头文件中,事实上,为了可维护性和不同的响应区域,可能有一个明智的理由将它分成几个较小的部分。分割成外部数据和内部数据的头文件是一个这样的原因,这应该不是问题,因为可以在同一源文件中包含多个头文件。并且不要忘记头文件中的警卫,这样,大多数情况下都避免了链接中的冲突。
#ifndef XXX_HEADER_FILE
#define XXX_HEADER_FILE
code
#endif