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

转发变量声明?

  •  8
  • Omair  · 技术社区  · 14 年前

    struct A { 
        ...
        struct A * myPtr;
    }
    

    现在声明并初始化两个全局数组,如下所示:

    //Forward declaration of Unit
    struct A Unit[10];
    
    struct A* ptrUnit[2] = { Unit, Unit+7 };
    struct A Unit[10] = { { .., &ptrUnit[0] }, 
                          ... };
    

    现在,虽然C中的工作很好,但是它在C++中提供了一个错误(变量重新声明)。

    4 回复  |  直到 14 年前
        1
  •  20
  •   sbi    14 年前

    在C++中,变量 必须加前缀 extern :

    extern A Unit[10];
    
    // ...
    
    A Unit[10] = { ... };
    

    struct .)

        2
  •  20
  •   AnT stands with Russia    8 年前

    struct A Unit[10] 不是变量的正向声明。“远期申报”一词通常指 不确定的 声明,而 构造一个单元[10] 是一个 . 所以在代码中定义 Unit 在同一源文件中多次。在C语言中是允许的,因为在C语言中没有初始值设定项的定义是 暂定定义 . 它们可能在同一翻译单元中出现多次。在C++中,没有所谓的临时定义。在C++中,多个定义总是非法的。

    如果你想要一个真正的正向声明变量,你必须使用关键字 extern

    extern struct A Unit[10];
    

    外部的 联动装置。如果你需要一个变量 内部的

        3
  •  1
  •   Chubsdad    14 年前

    C allows (我猜)变量是有理由声明的。C++没有。一旦定义了“Unit”,就不能在同一范围内重新定义它

        4
  •  0
  •   Michael    6 年前

    制造 Unit 返回对[10]的引用并使实际数组成为函数中的静态变量的函数。

    // in hpp file
    A[10]& Unit();
    
    // in cpp file
    A[10]& Unit() {
        static A[10] value;
        return value;
    }