C ++:在头文件中定义void *数组并在cpp文件中声明它?

时间:2014-08-16 18:13:54

标签: c++ arrays namespaces header-files void-pointers

我看到了this问题,我试图做,因为问题的答案说。在头文件中使用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"无法在当前范围内定义

我不知道为什么会这样。

1 个答案:

答案 0 :(得分:2)

首先,你应该将main()声明为int!见here为什么。

在命名空间中将数组声明为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 []在同一编译单元中定义的事实。但链接器会抱怨,因为:: d(1)是对函数d的调用,返回指向结构的指针,并且此函数无处定义。

因此,您还应该定义:

namespace a { 
    struct T* d(int e)
    {
        return nullptr;         // in reality you should return a pointer to struct T
    }
} 

有趣的是,struct T不需要为此代码编译和链接。