C++:具有相同名称的文件范围常量是否违反了一个定义规则?
C++: Filescope constants with same name are breaking one definition rule?
我在 2 个不同的 .cpp
文件中有 2 个常量,
都命名为 const char const * TEXTURE_FILENAME = "...";
一个在 a.cpp
中,另一个在 b.cpp
中,在文件范围内,两个文件都不包含另一个或应该看到另一个,但 VS2010 生成此链接器错误:
a.obj : error LNK2005: "char const * const TEXTURE_FILENAME" (?TEXTURE_FILENAME@@3PBDB) already defined in b.obj
我在这里做错了什么,我如何在不需要重命名常量的情况下修复它?
What am I doing wrong here, and how might I fix it without needing to rename either constant?
您正在定义两个名为 TEXTURE_FILENAME
的对象。就是这个问题。
解决问题的方法不止一种。最简单的解决方法是在文件范围内使它们 static
。
static const char * TEXTURE_FILENAME = "...";
更新,回应OP的评论
TEXTURE_FILENAME
不是 const
对象。它恰好指向一个 C 风格的字符串,即 const
。您可以使用以下命令修改文件中其他地方的 TEXTURE_FILENAME
位置:
TEXTURE_FILENAME = <some other C style string>;
要使 TEXTURE_FILENAME
成为 const
,您需要使用:
// Both the pointer and what it points to are const.
const char * const TEXTURE_FILENAME = "...";
你想在两个文件中拥有该指针的两个副本,还是两个文件都使用一个副本?
如果您想要两份,每个文件一份,只需标记它们即可static
;这将使每一个只在定义它的文件中可见。
如果您想要一个对两个文件都可见的副本,请将 一个 文件更改为读取
extern const char * TEXTURE_FILENAME;
我对问题中 const
的不一致用法感到困惑,因此请适当调整。关键是通过删除初始化程序并添加 extern
你告诉编译器 TEXTURE_FILENAME
是在其他文件中定义的。
我在 2 个不同的 .cpp
文件中有 2 个常量,
都命名为 const char const * TEXTURE_FILENAME = "...";
一个在 a.cpp
中,另一个在 b.cpp
中,在文件范围内,两个文件都不包含另一个或应该看到另一个,但 VS2010 生成此链接器错误:
a.obj : error LNK2005: "char const * const TEXTURE_FILENAME" (?TEXTURE_FILENAME@@3PBDB) already defined in b.obj
我在这里做错了什么,我如何在不需要重命名常量的情况下修复它?
What am I doing wrong here, and how might I fix it without needing to rename either constant?
您正在定义两个名为 TEXTURE_FILENAME
的对象。就是这个问题。
解决问题的方法不止一种。最简单的解决方法是在文件范围内使它们 static
。
static const char * TEXTURE_FILENAME = "...";
更新,回应OP的评论
TEXTURE_FILENAME
不是 const
对象。它恰好指向一个 C 风格的字符串,即 const
。您可以使用以下命令修改文件中其他地方的 TEXTURE_FILENAME
位置:
TEXTURE_FILENAME = <some other C style string>;
要使 TEXTURE_FILENAME
成为 const
,您需要使用:
// Both the pointer and what it points to are const.
const char * const TEXTURE_FILENAME = "...";
你想在两个文件中拥有该指针的两个副本,还是两个文件都使用一个副本?
如果您想要两份,每个文件一份,只需标记它们即可static
;这将使每一个只在定义它的文件中可见。
如果您想要一个对两个文件都可见的副本,请将 一个 文件更改为读取
extern const char * TEXTURE_FILENAME;
我对问题中 const
的不一致用法感到困惑,因此请适当调整。关键是通过删除初始化程序并添加 extern
你告诉编译器 TEXTURE_FILENAME
是在其他文件中定义的。