假设我有:
struct Vec3 {
double x;
double y;
double z;
} ;
inline double dot(const Vec3& lhs, const Vec3& rhs) {
return lhs.x * rhs.x + lhs.y * rhs.y + lhs.z * rhs.z ;
}
是否有可能在非内联版本中存在“dot”,因此它可以在* .so中,这样当我打开它时我可以调用它?
即。我希望包含上述标题的文件使用内联版本,但我也希望函数存在于* .so中,所以我可以打开它并动态调用它。
答案 0 :(得分:3)
你可以这样做:
inline double dot(const Vec3& lhs, const Vec3& rhs) {
return lhs.x * rhs.x + lhs.y * rhs.y + lhs.z * rhs.z;
}
double dot(const Vec3* lhs, const Vec3* rhs) {
return dot(*lhs, *rhs);
}
这样做的好处是,如果你将“指针”版本声明为extern "C"
,那么C程序也可以使用它。 (C不支持引用,但支持指针---所以你不能extern "C"
“引用”版本。)
答案 1 :(得分:2)
如果您想通过dlopen
获取该功能,则必须为extern "C"
。有趣的事实:您可以在命名空间中放置extern "C"
声明,并且名称修改时会忽略命名空间,但仍然会生成与全局命名空间声明不同的声明。
// something.h (C++)
inline double dot(const Vec3& lhs, const Vec3& rhs) { /*...*/ }
// something.cpp
namespace for_dlopen {
extern "C" double dot(const Vec3& lhs, const Vec3& rhs)
{
return ::dot(lhs, rhs);
}
}
编辑:Chris提出了一个很好的观点 - 它绝对不能移植到带有引用参数的函数extern "C"
,但我相信如果你打算只用dlsym
并使用强制转换它,它应该适用于g ++它是原始的C ++类型。