我使用的库为脚本语言定义了内部除法运算符。不幸的是,它不会对除数进行零检查。这会导致很多头痛。我知道接线员的签名。
double ScriptClass::Divide(double&, double&);
遗憾的是它甚至不是一个 C 函数。有什么方法可以让我的应用程序使用我自己的Divide函数而不是ScriptClass::Divide函数?
编辑:我知道dlopen(NULL,..)并用用户定义的函数替换“C”函数。可以对类成员函数执行此操作(而不诉诸使用损坏的名称)吗?
一般来说,这取决于程序员,而不是底层的除法运算符来防止被零除。如果您多次除以零,则似乎表明所使用的算法可能存在缺陷。考虑重新设计算法,或者如果这不是一个选择,则守卫调用以零检查进行除法。您甚至可以在protected_divide类型函数内执行此操作。
话虽这么说,假设因为它看起来像一个 C++ 函数,所以您有一个 C++ 库,它使用您用于构建应用程序的所有相同选项进行编译,因此名称修饰匹配,您可以将函数重新定义为 a.so并LD_PRELOAD用于强制其加载。如果您静态链接,我认为您可以将函数创建到您自己的.o文件中,并在库本身之前链接该函数将导致链接器选择您的版本。