在不同的翻译单元中的两个变量违反了一个定义规则

Two variables in seperate translation units are violating the one definition rule?

本文关键字:一个 规则 定义 变量 两个 单元 翻译      更新时间:2023-10-16

我在两个.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

我不经常使用文件作用域变量,所以我认为这将是好的…我哪里做错了?

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