gpt4 book ai didi

c - 不同文件中具有相同名称的函数 - C

转载 作者:行者123 更新时间:2023-12-03 16:05:23 27 4
gpt4 key购买 nike

我有两个同名的函数,想在我的应用程序中使用它。

我引用了各种答案,例如 here在这里但无法得到明确的解决方案。

我有以下功能

// xxxx_input.h

int8_t input_system_init(InputParams params);

int8_t input_system_easy_load(uint32_t interval_ms);

// yyyy_input.h

int8_t input_system_init(InputParams params);

int8_t input_system_easy_load(uint32_t interval_ms);

有两个文件的原因是 xxxx_inputyyyy_input内部工作方式不同。

修改函数并不容易,因为代码是由外部提供的,我们必须保留 xxxx_input 文件。

我们能做的就是修改 yyyy_input.h但功能类似于 input_system_easy_load因为它们是从不同的地方调用的,所以要保持一致。

有没有办法我们可以达到同样的效果?

我尝试替换 xxxx_inputyyyy_input.h但由于包含目录已经包含相同的功能,它会给出错误。

input_system_init 多次定义(由 xxxx_input.o 和 yyyy_input.o)。

最佳答案

如果您有 xxxx_input.h 中定义的函数的源代码和 yyyy_input.h ,您可以使用命令行选项编译两个模块,通过预处理器重新定义函数名称:

gcc -Dinput_system_init=xxxx_input_system_init -Dinput_system_easy_load=xxxx_input_system_easy_load xxxx_input.c
gcc -Dinput_system_init=yyyy_input_system_init -Dinput_system_easy_load=yyyy_input_system_easy_load yyyy_input.c

然后,您将使用修改后的原型(prototype)编译您的代码,您可以将所有 3 个模块链接在一起。

如果模块仅以对象形式提供,您可以定义包装函数 xxxx_input_system_initxxxx_input_system_easy_load您将与 xxxx_input.o 链接以生成动态库,对于 yyyy 也是如此备择方案。您将在模块中使用修改后的原型(prototype),并将其与动态库链接。

Mike Kinghan 展示了 simpler approach对于系统上的目标文件和库, objcopy可用。

要自动获取修改后的原型(prototype),您可以使用以下包含文件:

我的输入系统.h :

#define input_system_init  xxxx_input_system_init
#define input_system_easy_load xxxx_input_system_easy_load
#include "xxxx_input.h"
#undef input_system_init
#undef input_system_easy_load

#define input_system_init yyyy_input_system_init
#define input_system_easy_load yyyy_input_system_easy_load
#include "yyyy_input.h"
#undef input_system_init
#undef input_system_easy_load

/* prevent direct use of the redefined functions */
#define input_system_init do_not_use_input_system_init@
#define input_system_easy_load do_not_use_input_system_easy_load@

关于c - 不同文件中具有相同名称的函数 - C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61952507/

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