代码之家  ›  专栏  ›  技术社区  ›  Summer_More_More_Tea

对二维数组的引用

c++
  •  5
  • Summer_More_More_Tea  · 技术社区  · 15 年前

    #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 ][] );
    

    现在,当作为( 花瓶

    drawCylinder( 10, 10, vase );
    

    编译错误:

    错误2错误C2664:“drawCylinder”:无法将参数3从“GLfloat[14][3]”转换为“GLfloat(&)[14] [1]'d:\Visual Studio 2008\Projects\Project1\Computer Graphics\VaseAndanition\vase.cpp 64 VaseAndanition

    错误3错误C2087:“顶点”:缺少下标d:\visual studio 2008\projects\project1\computer graphics\VaseAndInformation\shapes.h 25 VaseAndInformation

    错误4错误C2087:“顶点”:缺少下标d:\Visual Studio 2008\Projects\Project1\Computer Graphics\VaseAndAnimation\shapes.cpp 12 VaseAndAnimation

    vertices 实际上是一个二维数组的引用,但是为什么呢 花瓶 解析为 float (* vase)[3] 在我的第一个版本里?

    我的IDE是visualstudio2008,我还没有尝试过GCC;这种行为依赖于编译器吗?

    希望有人能帮我摆脱这个陷阱。

    2 回复  |  直到 5 年前
        1
  •  2
  •   Kirill V. Lyadvinsky    15 年前

    你的第一次申报很好。似乎你已经定义了 vase 在头文件中。

        2
  •  1
  •   Peter Alexander    15 年前

    看起来问题只是 vase 正在 定义 在头文件中。你应该 声明

    这会导致一个问题,因为多个定义会产生多个相同的符号,这会混淆链接器(从而导致链接器错误)。当链接器试图将对变量的引用与实际定义匹配时,它不知道使用哪一个。

    头部防护装置不能防止这种情况。标头保护中使用的宏仅定义为 每翻译单位 . 每次编译器开始编译一个新的.cpp文件(忽略unity构建等),这就是一个新的翻译单元,基本上编译器是从头开始的,不知道以前定义的任何符号。

    头文件中的变量:

    // extern specifies that the definition is elsewhere.
    extern int myGlobalVariable;
    

    然后 这个变量

    int myGlobalVariable;