我正在尝试使用两个大型复杂的线性代数库来定义许多相同的函数.我无法重写(在一个案例中合法,但在技术上都在两者中).让我们称它们为"特殊"和"正常",因为我只调用特殊的几个函数.为了始终如一地调用函数中定义的函数,normal.h并且仅在某些情况下调用函数special.h,我做了类似的事情:
namespace special_space
{
#include "special.h" // Defines foo()
}
#include "normal.h" // Defines foo()
int main() {
foo(); // Calls foo() defined in normal.h
special_space::foo(); // Calls foo() defined in special.h
}
Run Code Online (Sandbox Code Playgroud)
使用g ++ - 4.4,这是我开发它的默认设置,代码编译和链接没有警告,它按照我的预期和我想要的方式执行.这似乎在各种平台,各种Linux,Unix和BSD环境中是一致的.但!如果我使用g ++> 4.4进行编译,我会收到有关多个foo()定义的警告:
在文件special.h :: line:col:warning中:使用C语言链接声明'void special_space :: foo()'[默认启用]
生成的可执行文件然后在调用时段错误special_space::foo().我想/ extern "C++"在special.h中找到的定义中指定可能会解决这个问题,但是我不允许更改special.h.所以我该怎么做?进一步来说:
1)使用g ++ - 4.4是否安全?如果是这样 - 后续版本有什么变化,为什么?
2)如果指定C++链接模型真的会解决这个问题,有没有办法告诉ld默认使用它?
3)如果这两者都没有 - 是否有另一种方法从定义同名函数的库中调用函数?