gpt4 book ai didi

c++ - 在头文件中使用命名空间时的多重定义

转载 作者:搜寻专家 更新时间:2023-10-31 01:33:54 25 4
gpt4 key购买 nike

我试图在头文件 global.h 中定义一个全局命名空间。

...
namespace g {
const int g_0 = 0;
const int g_1 = 1;
}
...

当 JUST #include "global.h" 在其他 .cpp 文件中时,编译器会报错

multiple definition of g::g_0
multiple definition of g::g_1

例如,如果我尝试在其他 .cpp 文件中使用 g_0g_1

int g_0_copy = g::g_0;
int g_1_copy = g::g_1;

它抛出一个错误说:

ISO C++ forbids in-class initialization of non-const static member...

使用命名空间声明全局变量有什么特别之处吗?(在这种情况下我必须使用 c++98)

最佳答案

如果您所有的全局变量都是const,您很可能只需要包含守卫。

#ifndef   GLOBAL_H
#define GLOBAL_H

...
namespace g {
const int g_0 = 0;
const int g_1 = 1;
}
...

#endif // GLOBAL_H

const global variables have internal linkage unless explicitly declared extern ,因此只要每个翻译单元只定义一次,它们就不会导致链接错误。每个翻译单元都有自己的每个全局常量拷贝,如果可能,编译器可能会优化也可能不会优化。


但是,如果您的一些全局变量不是 const,它就会变得有点复杂。

#ifndef   GLOBAL_H
#define GLOBAL_H

...
namespace g {
const int g_0 = 0;
const int g_1 = 1;

int g_2 = 2; // Oh, boy.
}
...

#endif // GLOBAL_H

由于该变量默认具有外部链接,因此会因多个翻译单元包含名为g_2 的不同变量而导致链接错误。这里的解决方案是在 header 中声明变量 extern,并将它们的实际定义放在源文件中。

// global.h
#ifndef GLOBAL_H
#define GLOBAL_H

...
namespace g {
const int g_0 = 0;
const int g_1 = 1;

extern int g_2; // Oh, boy.
}
...

#endif // GLOBAL_H

// ---

// global.cpp
namespace g {
int g_2 = 2;
}

也就是说,如 SergeyA指出in the comments ,您收到的错误消息表明还有更多内容:

ISO C++ forbids in-class initialization of non-const static member...

在不知道是什么代码导致的情况下,我对此无话可说。

关于c++ - 在头文件中使用命名空间时的多重定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40514928/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com