【发布时间】:2021-09-03 19:41:20
【问题描述】:
假设我有两个(或更多)c 函数 func1() 和 func2() 都需要缓冲区变量 int buff。如果这两个函数都保存在单独的文件中,func1.c 和 func2.c,我该怎么做才能使 buff 只能被 func1() 和 @ 访问987654326@ 而不是调用例程(或任何其他例程)。
这是一个示例设置:
文件func1.c:
/*func1.c*/
static int buff;
int *func1(int x)
{
buff = x;
return &buff;
}
文件func2.c:
/*func2.c*/
static int buff;
int *func2(int x)
{
buff = x;
return &buff;
}
标题header.h:
/*header for func1.c and func2.c*/
//multiple inclusion guard not present.
int *func1(int);
int *func2(int);
文件main.c:
#include<stdio.h>
#include"header.h"
int main()
{
int *ptr;
ptr = func1(1);
printf("&buff = %p , buff = %d\n", ptr, *ptr);
ptr = func2(2);
printf("&buff = %p , buff = %d\n", ptr, *ptr);
return 0;
}
正如预期的那样,输出显示 buff 的不同内存位置。
&buff = 0x55b8fd3f0034 , buff = 1
&buff = 0x55b8fd3f0038 , buff = 2
但我只需要一个副本增益,不需要更多。
当然,我可以将两个函数放在同一个文件中,并将 buff 定义为 static int,但这样我将失去分别编译这些函数的能力。
如果我将int buff 放在单独的 buff.c 中并在 func1.c 和 func2.c 中声明它 extern em>,但调用例程(在本例中为 main)很容易访问它。
基本上,我需要创建一个函数库,这些函数库可以在同一个外部对象上工作,并且只有他们可以访问。调用例程可能不需要所有函数,因此我不想将它们放在一个文件中并创建未使用的代码。但对象必须只有一个副本。
如果可以的话,请帮助我如何做同样的事情。
【问题讨论】:
-
您必须将所有需要
buff的函数作为“私有”变量放在同一个文件中。 -
"...所以我不想将它们放在一个文件中并创建未使用的代码。"除非你有大量的函数,否则我不会担心。
-
您建议您正在构建一个库。我很确定事后有一些不错的方法来操作库的符号表,以调整诸如符号可见性之类的东西。所以你可以(a)使用一个普通的全局变量,(b)构建你的库,(c)调整库以使全局变量非全局,并且(d)确保你的库的客户无法欺骗和偷看它。
-
@SteveSummit,我做了变通方法和调整,基本上我也很想知道通过丢弃未使用的“未使用代码”可以减少多少最终可执行文件的大小(意思是文件大小)函数定义。
-
对于“常规”库(
.a、.lib)和静态链接,我希望拆分您的源文件,以便不需要的函数不会复制到最终的可执行文件中,帮助使最终的可执行文件更小。但是对于动态链接的库(.so,.dll),据我所知,无论如何,所有内容总是最终在加载的库中,但没有一个最终在使用该库的可执行文件中,所以我不会期待它有所作为。