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 是在其他文件中定义的。