假设我有:
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 ;
}有没有可能在非内联版本中也存在“点”,这样它就可以在*.so中,这样当我打开它时,我就可以调用它?
也就是说,我希望包含上述头文件的文件使用内联版本,但我也希望函数存在于*.so中,这样我就可以dl打开它并动态调用它。
发布于 2010-12-25 03:34:35
你可以这样做:
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"“引用”版本。)
发布于 2010-12-25 03:41:15
如果要通过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获得它并将其转换为原始的C++类型,那么它应该可以与g++一起工作。
https://stackoverflow.com/questions/4527824
复制相似问题