【问题标题】:C++: Defining void* array in header file and declaring it in a cpp file?C++:在头文件中定义 void* 数组并在 cpp 文件中声明它?
【发布时间】:2014-08-16 18:13:53
【问题描述】:

我看到this 的问题,我尝试按照该问题的答案进行操作。在头文件中使用 extern 关键字定义一个数组,然后在其他 cpp 文件中的该命名空间或类之外声明它。

它真的对我不起作用,我不确定是因为我使用的是 void 指针数组(即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[];
}

所以问题是我收到错误: IntelliSense:无法在当前范围内定义变量“a::b”

我不知道为什么会这样。

【问题讨论】:

  • 如果您还必须发布免责声明,如何更简洁?
  • intvoid 短一个字符... a::b 在函数外部声明,定义也应该在外部,为什么要写在main 内部?
  • @OliCharlesworth 现在编辑了我的问题。
  • 因此,您没有修复void main(),而是删除了您输入错误内容的原因。杰出的。并且a::b 的定义需要在命名空间范围内,而不是在块范围内。
  • @MarcGlisse 因为我想要尽可能短的版本,所以我使用了void main,因为这样我就不必返回任何东西了。

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


【解决方案1】:

首先,您应该将 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[] 在同一编译单元中定义的事实。但是链接器会抱怨,因为 a::d(1) 是对函数 d 的调用,它返回一个指向结构的指针,而这个函数在任何地方都没有定义。

因此你也应该定义这个:

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

有趣的是,struct T 不需要为这段代码工作来编译和链接。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-12-21
    • 2011-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-27
    • 1970-01-01
    相关资源
    最近更新 更多