为什么链接器不会在这里产生多个定义错误?

时间:2013-02-27 18:51:13

标签: c++ global-variables

我有一个像这样的简单.h文件:

//test.h
int x = 12;

如果我包含此文件,例如main.cppfunctions.cpp链接器将产生此错误,这是合理的:

error LNK2005: "int x" (?x@@3HA) already defined in functions.obj

但是当我更改变量定义时:

//test.h
const int x = 12;

链接器错误消失了。方式是什么?

1 个答案:

答案 0 :(得分:5)

在名称空间作用域const声明的名称具有内部链接。也就是说,包含test.h的每个文件都有自己的名为x的对象。见§7.1.1/ 7:

  

在没有存储类说明符的命名空间范围内声明的名称具有外部链接,除非由于先前的声明而具有内部链接,并且未声明const。声明为const且未明确声明为extern的对象具有内部链接。