单独翻译单元中的两个变量违反了一个定义规则?

Ann*_*inn 2 c++ linker linker-errors

我有const char * FILENAME = "a/file/name"两个.cpp文件中定义的变量,名为a.cppb.cpp.没有任何内容直接包含这些文件,它们只包含a.hb.h分别包含在自身中.然后包含这两个头文件main.cpp

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

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

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

Dev*_*lus 5

如果它们代表相同的文件,那么您应该声明其中一个文件extern以引用另一个模块中的定义.

File1.cpp

const char * FILENAME = "a/file/name";
Run Code Online (Sandbox Code Playgroud)

File2.cpp

extern const char * FILENAME;
Run Code Online (Sandbox Code Playgroud)

如果它们是碰巧具有相同名称的两个单独变量,那么您应该将它们声明为静态,以便它们仅在编译单元内可见.

static const char * FILENAME = "a/file/name";
Run Code Online (Sandbox Code Playgroud)

发生这种情况的原因是,因为隐式静态仅适用于const对象.你的指针不是const,只有引用的对象是const.

要实现这一点,你必须写:

const char * const FILENAME = "a/file/name";
Run Code Online (Sandbox Code Playgroud)