内联和不列直插式

时间:2010-12-24 18:40:24

标签: c++

假设我有:

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中,所以我可以打开它并动态调用它。

2 个答案:

答案 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 ++类型。