【问题标题】:Two variables in seperate translation units are violating the one definition rule?单独翻译单元中的两个变量违反了一个定义规则?
【发布时间】:2015-09-24 07:28:04
【问题描述】:

我在两个 .cpp 文件中定义了一个变量 const char * FILENAME = "a/file/name",称为 a.cppb.cpp。没有任何东西直接包含这些文件,它们只分别包含a.hb.h。然后这两个头文件都包含在main.cpp

我的问题是我收到以下链接器错误:

a.obj : error LNK2005: "char const * const FILENAME" (?FILENAME@@3PBDB) already defined in b.obj

我不经常使用文件范围变量,所以我认为这没关系...我在这里做错了什么?

【问题讨论】:

  • 是的,这违反了单一定义规则。 FILENAME 有两个定义。一个简单的解决方法是将其设为static const char FILENAME[] = "a/file/name";
  • @Morlacke 不,不是。 FILENAME 不是 OP 代码中的 constconst 适用于被指向的东西。
  • 话虽如此,错误消息显示char const * const FILENAME所以也许你做了其中一个const而另一个不是const

标签: c++ linker linker-errors


【解决方案1】:

如果它们代表同一个文件,那么您应该将其中一个声明为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。

要实现这一点,您必须编写:

const char * const FILENAME = "a/file/name";

【讨论】:

  • 他们是第二个。我想我错误地认为static 在文件范围内定义时是隐含的。谢谢!
  • 在 C++ 中 static const 和 const 是同一个声明。 stackoverflow.com/questions/177437/…
  • 就个人而言,我不鼓励在非必要时使用全局变量,但这当然取决于使用情况。
  • @Morlacke 仅用于顶级const,Devolus 的示例错误地省略了它。 const char *const FILENAME = "a/file/name"; 会完成这项工作。无论如何,包含static 并没有什么坏处。
  • @M.M,你能解释一下你所说的顶级 const 是什么意思吗?
猜你喜欢
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
  • 2021-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多