将变量保持全局到C中的库范围

时间:2009-04-16 11:51:20

标签: c scope

有没有办法让全局变量只能从库内部看到,而在C中访问该库的程序无法访问?

并不是保持变量受保护是至关重要的,但如果程序无法导入它,我宁愿这样做,因为它不属于他们的业务。

我不关心涉及宏的解决方案。

4 个答案:

答案 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