单独翻译单元中的两个变量违反了一个定义规则?
Two variables in seperate translation units are violating the one definition rule?
我在两个名为 a.cpp
和 b.cpp
的 .cpp 文件中定义了一个变量 const char * FILENAME = "a/file/name"
。没有直接包含这些文件,它们只分别包含 a.h
和 b.h
到它们自己。然后这两个头文件都包含在 main.cpp
中
我的问题是出现以下链接器错误:
a.obj : error LNK2005: "char const * const FILENAME" (?FILENAME@@3PBDB) already defined in b.obj
我不经常使用文件范围变量,所以我认为这没问题...我在这里做错了什么?
如果它们代表同一个文件,那么你应该将其中一个声明为extern
以引用另一个模块中的定义。
File1.cpp
const char * FILENAME = "a/file/name";
File2.cpp
extern const char * FILENAME;
如果它们是两个碰巧同名的独立变量,那么您应该将它们声明为静态的,这样它们只在编译单元内可见。
static const char * FILENAME = "a/file/name";
发生这种情况的原因是,隐式静态仅适用于常量对象。虽然你的指针不是 const,只有引用的对象是 const。
要做到这一点,你必须写:
const char * const FILENAME = "a/file/name";
我在两个名为 a.cpp
和 b.cpp
的 .cpp 文件中定义了一个变量 const char * FILENAME = "a/file/name"
。没有直接包含这些文件,它们只分别包含 a.h
和 b.h
到它们自己。然后这两个头文件都包含在 main.cpp
我的问题是出现以下链接器错误:
a.obj : error LNK2005: "char const * const FILENAME" (?FILENAME@@3PBDB) already defined in b.obj
我不经常使用文件范围变量,所以我认为这没问题...我在这里做错了什么?
如果它们代表同一个文件,那么你应该将其中一个声明为extern
以引用另一个模块中的定义。
File1.cpp
const char * FILENAME = "a/file/name";
File2.cpp
extern const char * FILENAME;
如果它们是两个碰巧同名的独立变量,那么您应该将它们声明为静态的,这样它们只在编译单元内可见。
static const char * FILENAME = "a/file/name";
发生这种情况的原因是,隐式静态仅适用于常量对象。虽然你的指针不是 const,只有引用的对象是 const。
要做到这一点,你必须写:
const char * const FILENAME = "a/file/name";