首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >内联&非内联

内联&非内联
EN

Stack Overflow用户
提问于 2010-12-25 02:40:24
回答 2查看 566关注 0票数 1

假设我有:

代码语言:javascript
复制
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打开它并动态调用它。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-12-25 03:34:35

你可以这样做:

代码语言:javascript
复制
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"“引用”版本。)

票数 3
EN

Stack Overflow用户

发布于 2010-12-25 03:41:15

如果要通过dlopen获取函数,它必须是extern "C"。有趣的事实:您可以将extern "C"声明放在名称空间中,名称空间会因为名称混乱而被忽略,但仍然会使其中的声明与全局名称空间声明不同。

代码语言:javascript
复制
// 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++一起工作。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4527824

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档