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

2 c scope

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

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

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

Ark*_*nez 9

如果使用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)


dsm*_*dsm 7

static int somelocalvar = 0;
Run Code Online (Sandbox Code Playgroud)

这使得somelocalvar只能从声明它的源文件(参考和示例)中看到.

  • 像这样的全局变量是设计缺陷的迹象.如果我是你,我会重新考虑你想要做什么. (4认同)

Bas*_*ard 6

在库实现中,声明你的变量:

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声明放在标题中,最终用户不会使用它.