当前位置: 首页 > 面试题库 >

如何隐藏在多个文件中可见的全局变量?

平光明
2023-03-14
问题内容

我正在编写一个C(共享)库。它最初是一个翻译单元,我可以在其中定义几个static全局变量,以将其隐藏在外部模块中。

现在该库已扩展,我想将该模块分为几个较小的源文件。问题在于,对于上述全局变量,我现在有两个选择:

  1. 在每个源文件上都有私有副本,并通过函数调用以某种方式同步它们的值-这将非常丑陋,非常快。

  2. 删除static定义,以便使用extern- 在所有翻译单元之间共享变量,但是,如果在此处进行了必需的声明,则链接到库的应用程序代码现在可以访问这些全局变量。

那么,是否有一种巧妙的方法可以使私有全局变量在多个特定的翻译单元之间共享?


问题答案:

您需要GCC 的可见性属性扩展。

实际上,类似:

 #define MODULE_VISIBILITY  __attribute__ ((visibility ("hidden")))
 #define PUBLIC_VISIBILITY  __attribute__ ((visibility ("default")))

(您可能想要#ifdef上面的宏,使用一些配置技巧àla autoconf和其他 自动工具 ;在其他系统上,您将只有空的定义,如#define PUBLIC_VISIBILITY /*empty*/etc …)

然后,声明一个变量:

int module_var  MODULE_VISIBILITY;

或功能

void module_function (int) MODULE_VISIBILITY;

然后,您可以在共享库中使用module_var或调用module_function,但不能在外部使用。

另请参见GCC 的-fvisibility代码生成选项。

顺便说一句,您还-Dsomeglobal=alongname3419a6可以someglobal像往常一样编译和使用整个库;要真正找到它,您的用户将需要将相同的预处理器定义传递给编译器,并且可以使名称alongname3419a6随机且不太可能使冲突不太可能。

PS。这种可见性 特定于GCC (可能还 特定于 ELF共享库,
例如Linux上的那些)。如果没有GCC或没有共享库,它将无法正常工作。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。也许其他一些编译器(clang来自LLVM)也可能支持
Linux上共享库 (不是静态
)。实际上,真正的隐藏(针对单个共享库的多个编译单元)主要是由链接程序完成的(因为ELF共享库允许这样做)。




 类似资料:
  • 问题内容: 我有2个守护程序,它们应该访问相同的变量。我为全局变量创建了第3个文件,每个守护程序都可以访问该变量。但是,当一个更改变量时,另一个仍然看到默认值。 例: glob.py 守护程序a: 守护程序b: 每次我希望我将问题弄清楚时,它将打印0,并且有人可以帮助我。如果您需要更多信息,请随时询问。 问题答案: 看起来(尽管您没有明确告诉您)您正在以一种完全独立的方式运行程序:Python解释

  • 问题内容: 我的一堆JavaScript代码位于一个名为helpers.js的外部文件中。在调用此JavaScript代码的HTML内,我发现自己需要知道是否已经调用了helpers.js中的某个函数。 我试图通过定义以下内容来创建全局变量: 在我的HTML代码和helpers.js中的全局范围内。 这是我的html代码如下所示: 我想做的事可行吗? 问题答案: 您需要在包含helpers.js文

  • 我总共有30个文件,我在15个文件中做了修改。我必须把那些文件藏起来。第一个仓库里有一些文件,在另一个仓库里,我需要其他文件。还有,有些文件我永远不会藏起来。我知道如何隐藏单个文件或整个文件。我需要一种方法来隐藏多个文件

  • 问题内容: 我需要所有文件中都需要的一些全局变量。 例如,考虑以下4个文件: 考虑到我将上述所有4个文件都加载到HTML文档中,有没有一种方法可以在其中声明3个全局变量并在其他3个文件中的任何一个中访问它们? 有人可以告诉我是否可行,还是可以解决这个问题? 问题答案: 只需在函数范围之外的global.js中定义变量: 为确保此方法有效,您必须先包含/链接到global.js,然后再尝试访问该文件

  • 我有一个简单的html表: PHP端的变量将向表单元格提供信息。 问题:是否可以隐藏具有空变量的表行,而只显示具有非空变量的行? 现在的问题:行是空的显示边框和样式,如果它是空的没有信息,它看起来很糟糕,我想隐藏那些不包含任何信息的行。

  • 问题内容: 我想知道为什么以下内容不起作用-xs隐藏在xs视图中。我觉得这与Bootstrap v4中引入的更改有关,但是我想知道与在CSS中相比,在此代码中仍然可以实现这一点吗?我正在使用默认的bootstrap.css文件。 问题答案: 添加此答案是因为接受的答案中的注释太长且不完整。如前所述,这些类在Bootstrap 4 beta中不再存在。 “ hidden-sm-DOWN到底是什么?”