已经在 .obj 中定义,即使有 #ifndef #define #endif
already defined in .obj even though with #ifndef #define #endif
所以我在头文件中有一个嵌套的命名空间。在命名空间中,我有一些独立的数据。但是在编译时,我得到了一个"已经在<中定义"。>.obj"。我尝试弄乱内联,但显然内联仅适用于函数。 这是我的代码:
#ifndef HEADER_H
#define HEADER_H
namespace sod {
namespace e {
const int _2D = 0;
const int _3D = 1;
const int _CUSTOM = 2;
const char *text1 = "I AM A C STRING"; // <-- char const * const sod::e::text1 (?text1@e@sod@@3PBDB) already defined in main.obj
const char *text2 = "I AM ALSO A C STRING"; // <-- char const * const sod::e::text2 (?text2@e@sod@@3PBDB) already defined in main.obj
};
};
#endif
我使用的编辑器是Visual Studio 2017。
任何帮助,不胜感激。
您的整数常量具有内部链接,因为它们被声明为const
。具体正因为如此,即使此头文件包含在多个翻译单元中,它们也不会产生多个定义错误。
您的字符串指针具有外部链接,因为它们未声明为const
。因此,当此头文件包含在多个翻译单元中时,您最终会出现多个定义错误。不允许在程序中对具有外部链接的对象进行多个非内联定义。
如果你希望你的字符串指针是const
的,就像你的整数一样,你应该这样声明它们
const char *const text = "whatever";
请注意声明中额外const
的位置。
但是,如果您希望指针成为可修改的全局变量,那么情况就不同了。在 C++17 编译器中,您只需添加inline
即可实现这一点
inline const char *text = "whatever";
在 C++17 之前,您必须跳过更复杂的箍组合和头文件中的extern
声明。(在此处搜索有关全局变量的主题 - SO 对此有很好的介绍。
附言包含保护与避免链接器错误无关。
有人发布了对我有帮助的正确答案,但我认为他们删除了该帖子。
简单的答案是使用extern
.
在我的头文件中:
#ifndef HEADER_H
#define HEADER_H
namespace sod {
namespace e {
extern const int _2D;
extern const int _3D;
extern const int _CUSTOM;
extern const char *text1;
extern const char *text2;
};
};
在 cpp 文件中:
#include "header.h"
namespace sod {
namespace e {
const int _2D = 0;
const int _3D = 1;
const int _CUSTOM = 2;
const char *text1 = "I AM A C STRING";
const char *text2 = "I AM ALSO A C STRING";
};
};
相关文章:
- 与C代码相比,为什么C++代码不需要"#define _POSIX_C_SOURCE 200809L"?
- 以下 C++ 代码用于 -> "#define idiv(a, b) (((a) + (b) / 2) / (b))" 是什么?
- 如何以静态代码分析友好的方式使用 #define 防护?
- C++相当于整数的 #define
- #define Dbg(fmt,..) (0) 是什么意思? 警告:表达式无效
- 在C++中使用变量而不是"#define"来指定数组大小是不是一种糟糕的做法?(C错误:在文件范围内
- 我们可以用 C 语言嵌套 #define 和 #if 吗?
- 如何将旧的 C 样式 #define 映射与现代C++进行调整?
- 找不到 #define 的函数定义
- "#define X X"是什么意思?
- 使用 constexpr 替换 #define 和 #ifdef 进行条件编译
- 野牛/flex:计算器将双精度值解释为整数,所以我添加了 YYSTYPE 双精度 #define 但我有多个编译错误
- 已经在 .obj 中定义,即使有 #ifndef #define #endif
- C 关于Intel PCM源代码#ifndef intelpcm_api #define intelpcm_api
- 需要澄清 #ifndef #define
- C++ #ifndef TOKEN #define TOKEN
- c++结合了#define和#ifndef宏
- 具有标头的循环依赖关系.使用#ifndef和#define
- 在#ifdef或#ifndef中有多个#define
- #ifndef #define 指令是什么意思