全局结构赋值给出了名称类型错误

时间:2013-02-10 00:30:13

标签: c++ compiler-construction

我在" parser.h"

中有这样的结构
struct obj{
        char *filename;
        unsigned long nverts;
        unsigned long curvert;
        double (*verts)[3]; 
        unsigned int *faces[3]; 
};

typedef obj obj;

和parser.cpp

我宣布

  obj objmesh;

    objmesh.filename="c://temp//wings.obj";
    objmesh.nverts = 20;
    objmesh.verts = (double (*)[3]) malloc( objmesh.nverts *  sizeof(double[3]) );
    objmesh.curvert = 0;

当我在parser.cpp顶部执行这些分配时,我得到了"' objmesh'没有命名类型"错误。

但是当我将所有这些赋值放在parser.cpp中的函数中时(obj objmesh;具有全局范围),我没有错误并且编译得很好。

任何人都可以想到为什么会这样吗?我正在使用Mingw Gnu 4.6 C ++编译器

2 个答案:

答案 0 :(得分:4)

为什么呢?因为当你单独进行分配时,你基本上是为每个赋值执行指令,在C中它必须在函数中。

然而,您可以进行静态初始化(只要值是固定的)。编译器在编译时完成静态初始化,因此不会执行任何指令来设置struct的值。

double verts[20][3];

obj objmesh = {
    "c://temp//wings.obj",
    20,
    verts, /* declared above, not dynamically allocated */
    0
    };

如果你必须动态分配'verts',那么这对你不起作用。

答案 1 :(得分:3)

您需要在函数中进行分配,例如:

obj objmesh;

... 

int main(int argc, char **argv)
{
... possibly other stuff here... 
    objmesh.filename="c://temp//wings.obj";
    objmesh.nverts = 20;
    objmesh.verts = (double (*)[3]) malloc( objmesh.nverts *  sizeof(double[3]) );
    objmesh.curvert = 0;
... More code here ... 
}

顺便说一下: double (*)[3])请求typedef ...