C ++符号修改和导出=>允许代码重复?

时间:2010-12-04 09:41:51

标签: c++ code-duplication

在我们的项目中,我们有类似的东西:

struct PointI
{
  // methods for getting, setting and calculating some point stuff
private:
  int x;
  int y;
};

struct PointD
{
  // methods for getting, setting and calculating some point stuff
private:
  double x;
  double y;
};

我建议将其改为:

template<typename T>
struct Point
{
  // methods for gettig, setting and calculating some point stuff
private:
  T x;
  T y;
};

typedef Point<int> PointI;
typedef Point<double> PointD;
typedef Point<float> PointF;

但是被拒绝了,我被告知:“这种方法存在一个问题 - C ++符号修改和导出。模板在导出符号(使用它们的API)中使用时间很长,并且无法导出模板“。

这个论点是否如此强大以至于允许大量代码重复?

3 个答案:

答案 0 :(得分:4)

你的老板(或其他什么)可能是正确的。如果您编写的库可以使用其他语言而不是C ++,那么通常最好只在C语言中编写接口。

当然,您仍然可以在内部使用模板,只是不要公开它们。

答案 1 :(得分:1)

  

无法如何导出   模板

这仅适用于C链接(即,如果在导出时使用extern“C”)。从共享库中导出模板类没有技术问题 - 只需考虑从C ++运行时库导出的STL类。

确实,由于CPP的名称不是标准化,导出类的客户端必须使用与您相同的编译器(通常是相同的编译器版本) - 但这在封闭环境中是可以接受的。顺便说一下,这是您在安装新软件之前经常安装Microsoft的Visual C ++ 200X Redistributable软件包的原因。 MS可再发行软件包专门针对Windows平台上的CPP运行时库解决了这个问题。

答案 2 :(得分:0)

有导出模板的方法,如果您使用的是Visual Studio,则可以查看__declspec(dllimport/dllexport),它非常强大。我不知道其他编译器是否提供此功能。但是,如果您不导出C兼容接口,那么您基本上是强迫用户使用与您相同的编译器,至少是相同的供应商,如果不是完全相同的模型。