gpt4 book ai didi

cc -switch(或其他 "automatic"机制)以保持模块内的函数静态

转载 作者:太空宇宙 更新时间:2023-11-04 08:02:42 25 4
gpt4 key购买 nike

我有两个以前独立的模块,比如 this.cthat.c,我现在想将它们一起编译为 cc this.c that.c -o whatever 不要担心只有一个 ma​​in() 等;一切都已处理完毕,一切正常,除了以下...

每个模块包含几十个(可能总共 50 个)“重复”函数;名称相同但行为略有不同。而且我从不费心将它们声明为静态的。我开始编辑那个关键字,它本身会很长但可行。不幸的是,我还在每个调用它的其他函数中声明了每个函数,所以我必须编辑每个函数的入口点本身,以及每个调用任何其他函数的函数。所以现在这是一个麻烦的烂摊子。

请不要告诫我说模块太大了,废话,废话,废话。是的,这是我自己造成的困惑。但我的时间机器就在商店里,所以再强调这一点也没有用。

我想找到(但找不到)的是一些 cc -switch ,它说明了某种效果,-automatically-treat-all-functions-static-in -他们自己的模块 或类似的东西。所以,问题有什么方法可以做到这一点,而无需详尽地编辑几乎所有地方的所有内容?

(P.S. 其他类型的解决方案确实有效,例如,我可以单独编译它们并让“主要”一个 popen() 另一个并读取其输出。但这会导致繁琐的用户安装体验,我我想避免。所以将它们编译在一起是我能想到的唯一解决方案,它可以将所有“内部”保留在内部。)

最佳答案

如果您有 2 个同名但在不同模块中的函数,则必须在两者上都使用 static 关键字,否则在将对象链接在一起时会混淆链接器。

因此,无法自动为您执行此操作。

好的做法是,模块内的每个私有(private)函数都应声明为静态函数,以防止出现问题。

如果模块之间完全不同(一个模块与另一个模块没有任何依赖关系),那么根本没有问题,除非您有来自两个模块的具有相同名称的公共(public)用途函数。

//This approach is OK
that.c:
static int myfunc(void) {
return 5;
}

this.c:
static int myfunc(void) {
return 6;
}

这 2 个函数完全不同,并且仅在您的模块内可见。

关于cc -switch(或其他 "automatic"机制)以保持模块内的函数静态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44965652/

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