在头文件中定义void*数组,并在cpp文件中声明

C++: Defining void* array in header file and declaring it in a cpp file?

本文关键字:文件 并在 cpp 数组 声明 void 定义      更新时间:2023-10-16

我看到了这个问题,我试着按照这个问题的答案去做。在头文件中使用extern关键字来定义一个数组,然后在其他cpp文件的命名空间或类之外声明它。

它不适合我真的,我不确定,如果它是因为我使用一个空指针数组(即void* array[])或如果它只是我的无知,阻止我看到的问题。

这是我能想到的最短的例子:
[cpp.cpp]

#include "h.h"
void main(){
    void* a::b[] = {
        a::c = a::d(1)
    };
}
(h.h)

namespace a{
    struct T* c;
    struct T* d(int e);
    extern void* b[];
}

所以问题是我收到错误:变量"a::b"不能在当前作用域中定义

我不知道为什么。

首先,您应该将main()声明为int !请看原因。

在名称空间中声明数组为extern意味着它属于该名称空间,但在其他地方定义,通常在单独的编译单元中。

不幸的是,在main()中,您试图将元素重新定义为局部变量。这解释了您收到的错误消息。

你应该这样做:

#include "h.h"
void* a::b[] { a::c, a::d(1) };         // global variable belonging to namespace
int main()                  // int!!!
{
    /* your code here */  
}

代码可以编译。a::b[]定义在同一个编译单元中是可以接受的。但是链接器会抱怨,因为a::d(1)是对函数d的调用,返回一个指向结构体的指针,而这个函数在任何地方都没有定义。

因此你也应该定义这个:

namespace a { 
    struct T* d(int e)
    {
        return nullptr;         // in reality you should return a pointer to struct T
    }
} 
有趣的是,结构体T不需要为这段代码的编译和链接工作。