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

时间:2015-09-24 07:28:05

标签: c++ linker linker-errors

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

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

main.cpp

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

1 个答案:

答案 0 :(得分:5)

如果它们代表同一个文件,那么您应该将其中一个声明为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 char * const FILENAME = "a/file/name";