C++ 对二维数组的引用
我想用OpenGL实现一个函数,用C++来显示一个圆柱体。我的职能签名如下:C++ 对二维数组的引用,c++,C++,我想用OpenGL实现一个函数,用C++来显示一个圆柱体。我的职能签名如下: #define POINTS_NUM 15 #define DEMESION 3 void drawCylinder( int slices, int segments, GLfloat (&vertices)[ POINTS_NUM ][ DEMESION ] ); 我想使用对二维数组的引用来限制用户输入,但出现了一些奇怪的行为。当我实现上面声明的函数时,会发生链接器错误: 错误1错误LN
#define POINTS_NUM 15
#define DEMESION 3
void drawCylinder( int slices, int segments, GLfloat (&vertices)[ POINTS_NUM ][ DEMESION ] );
我想使用对二维数组的引用来限制用户输入,但出现了一些奇怪的行为。当我实现上面声明的函数时,会发生链接器错误:
错误1错误LNK2005:“float(*vase)[3]”(?vase@@3PAY02MA)已在shapes.obj vase.obj VaseAndAnimation中定义
此处vase
定义为:
GLfloat vase[ POINTS_NUM ][ DEMESION ];
起初,我认为最后一个维度有问题。所以我在第二次审判中忽略了它。我的函数的这次声明如下:
void drawCylinder( int slices, int segments, GLfloat (&vertices)[ POINTS_NUM ][] );
现在,调用时会出现编译时错误(vase
定义未更改):
编译错误:
错误1错误C2087:“顶点”:缺少下标d:\visual studio 2008\projects\project1\computer graphics\VaseAnimation\shapes.h 25 VaseAnimation
错误2错误C2664:“drawCylinder”:无法将参数3从“GLfloat[14][3]”转换为“GLfloat(&)[14][1]”d:\Visual Studio 2008\Projects\Project1\Computer Graphics\VaseAndAnimation\vase.cpp 64 VaseAndAnimation
错误3错误C2087:“顶点”:缺少下标d:\visual studio 2008\projects\project1\computer graphics\vaseandanimation\shapes.h 25 vaseandanimation
错误4错误C2087:“顶点”:缺少下标d:\Visual Studio 2008\Projects\Project1\Computer Graphics\VaseAndAnimation\shapes.cpp 12 VaseAndAnimation
从这个错误中,我可以看到参数顶点
实际上被视为二维数组的引用,但是为什么在我的第一个版本中vase
被解析为float(*vase)[3]
我的IDE是VisualStudio2008。我还没有试过GCC;这种行为依赖于编译器吗
希望有人能帮我摆脱这个陷阱。你的第一次声明很好。似乎您在头文件中定义了
vase
。问题似乎只是在头文件中定义了vase
。您应该只在头文件中声明变量
这会导致一个问题,因为多个定义会产生多个相同的符号,这会混淆链接器(从而导致链接器错误)。当链接器尝试将对变量的引用与实际定义相匹配时,它不知道使用哪一个
收割台防护装置不能防止这种情况。页眉保护中使用的宏仅按翻译单元定义。每次编译器开始编译一个新的.cpp文件(忽略unity builds等),这就是一个新的翻译单元,本质上编译器是从头开始的,不知道以前定义的任何符号
要解决此问题,请仅在头文件中声明变量:
// extern specifies that the definition is elsewhere.
extern int myGlobalVariable;
然后在one源文件中定义该变量
int myGlobalVariable;
是的,你是对的。仔细检查我的代码后,我发现花瓶是在函数声明之前定义的。但是为什么我不能在头文件中定义数组呢?我不知道有什么限制。谢谢。您的标题包含在几个cpp文件中。这意味着将多次定义
vase
。您可以在头文件中声明它,然后在一个cpp文件中定义它。是的,我知道这种情况。但是,我定义了一个宏来避免重复。问题仍然存在。在这种情况下,宏不起作用。每个cpp文件将有一个vase
。
int myGlobalVariable;