使用__declspec(dllexport)时,Struct不能使用构造函数

时间:2011-01-11 15:25:21

标签: c++ visual-c++

我尝试为C ++ struct定义构造函数,同时,这也是我想要导出的结构。所以这是我的代码:

extern "C"__declspec(dllexport) typedef struct
{
    double x;
    double y;

    PointCg(double xx, double yy);
}PointCg;

但是,我收到了编译错误

  

错误C4430:缺少类型说明符 -   int假设。注意:C ++没有   支持default-int

但我认为这是一个完全有效的声明?

我正在使用visual-c ++ 2008,如果它对你很重要的话。

3 个答案:

答案 0 :(得分:3)

__declspec与它没有任何关系。你正在定义一个匿名结构。 typedef名称不适用于定义构造函数。在定义中,PointCg看起来像一个函数名,函数必须有一个返回类型。这是在C ++中定义结构的方法:

struct PointCg{
   //....
   PointGc(double xx, double yy);
};

与C不同,您不需要输入结构名称以避免在任何地方键入struct,并且在引用该类型时可以使用PointCg而不是struct PointCg

答案 1 :(得分:2)

typedef只是基本类型的别名。这意味着typedef是编译时,而不是链接时构造。

在您的示例代码中,您正在尝试运行匿名结构的typedef - 这将使编译器在两个级别上混淆:首先,您要导出一个它不想做的别名,以及接下来,struct本身是匿名的,所以它甚至无法导出。第三,看起来像构造函数的东西不是。它只是一个奇怪名称的函数。一个ctor必须有结构的名称,以及它的匿名。

鉴于这个问题是c ++在使用结构时放宽了很多规则...为什么不跳过typedef并给结构命名:

extern "C"__declspec(dllexport) struct PointCg
{
  double x;
  double y;
  PointCg(double xx, double yy);
};

答案 2 :(得分:1)

  

错误C4430:假定mising类型说明符 - int。注意:C ++不支持default-int

这通常意味着您引入了一个对编译器没有任何意义的名称。事实上,我相信这就是这种情况。您正在使用古老的C技术来定义结构:typedef struct。当编译器到达你的(尚未命名的)struct的构造函数时,PointCg名称并不意味着什么。在结束}之后命名typedef之前,它没有任何意义。

我建议您按如下方式更改代码:

extern "C"__declspec(dllexport) struct PointCg
{
    double x;
    double y;

    PointCg(double xx, double yy);
};

在C ++中,实际上从来没有理由使用旧的typedef struct技术。这只会导致痛苦和困惑,并且什么都不会给你带来任何好处。