gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 04:37:56 24 4
gpt4 key购买 nike

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

现在库已经变大了,我想把模块分成几个较小的源文件。问题是现在我有两个选项可以用于提到的全局变量:

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

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

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

最佳答案

你想要 visibility attribute GCC 的扩展。

实际上,像这样:

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

(您可能想要#ifdef 上面的宏,使用一些配置技巧 à la autoconf 和其他 autotools;在在其他系统中,您可能只有空定义,例如 #define PUBLIC_VISIBILITY/*empty*/ 等...)

然后,声明一个变量:

int module_var  MODULE_VISIBILITY;

或函数

void module_function (int) MODULE_VISIBILITY;

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

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

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


附言。这种可见性特定于 GCC(也可能特定于 ELF 共享库,例如 Linux 上的共享库)。如果没有 GCC 或在共享库之外,它就无法工作……所以它非常特定于 Linux(即使其他一些系统,也许是带有 GCC 的 Solaris,也有)。可能一些其他编译器(clang 来自 LLVM)可能也支持在 Linux 上共享库(不是静态库)。实际上,真正的隐藏(对单个共享库的多个编译单元)主要由链接器完成(因为 ELF 共享库允许这样做)。

关于c - 如何隐藏在多个文件中可见的全局变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29211200/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com