我看到了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"无法在当前范围内定义
我不知道为什么会这样。
答案 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不需要为此代码编译和链接。