【发布时间】:2021-10-19 19:18:18
【问题描述】:
我有一个库,我无法更改在单个文件中声明、实现和使用某些函数的位置。许多其他的东西都在同一个文件中完成。我想覆盖那个单一的功能来做另一件事。问题是,当我使用重命名宏时,找到该宏/函数名称的所有位置都会被替换,包括声明和调用。我想要一些方法来重命名声明或调用。然后我就可以简单地将我自己的函数放在初始名称下作为替换。
代码如下所示:
// library-module.cpp
int foo(int a, int b) // declaration
{
return a+b;
}
int bar()
{
return foo(1, 2); // invocation
}
// main.cpp
// MAGIC HAPPENS HERE
#include "library-module.cpp"
int foo(int a, int b) // drop-in replacement
{
return a-b;
}
int main()
{
return bar(); // should be -1, not 3
}
另一种选择是进行反之亦然的操作:将所有调用替换为某个其他符号,但不替换声明。虽然它不是首选,因为可能还有其他用户使用该函数名称。
另一种选择是在运行时执行此操作,但我相信它不是那么好。
谢谢。
UPD1:
它是 c++。
这是文件中的实际函数declaration、implementation和usage。
我想要的是从使用该应用程序所有代码的其他应用程序中替换函数set_scenario 的单行,而不涉及任何其他内容。这个想法是保留所有代码的维护,除了那个非常功能,核心团队,并自己处理这个,因为我需要一些特定的实现。因此,我不包括标题,而是实现,并且想要这样一个肮脏的黑客。也许我走错路了?
最后我做了一个分叉,改变了线路并解决了这个问题,虽然我相信如果我不做一个分叉会更好,因为获得改变变得更加困难。
我想到的另一个想法可能是我必须为要更改的功能制作补丁并将其应用于每个构建。这样就可以准确地知道那一行发生了什么变化,并且如果我有补丁应用错误,我会立即知道初始函数发生了变化。也许这是实现相同目标的更好方法?
最后,使用宏来处理这个问题对我来说非常有趣,因为这对我来说是一种黑魔法。
再次感谢您。
【问题讨论】:
-
C 还是 C++?你能展示一下exact函数的声明和用法吗?细节可能很重要。
-
你可以用
#undef MACRO_NAME禁用宏,这样行吗? -
您通常不包含
.cpp文件,只包含.h文件。 -
定义宏在你定义了它替换的函数之后。
-
如果 OP 使用 C++,在自定义命名空间中定义他们希望覆盖的函数是一个好的解决方案吗?