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

Why doesn't linker produce multiple definition error here?

本文关键字:定义 错误 链接 在这里 为什么      更新时间:2023-10-16

我有一个简单的。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;

链接器错误消失。路吗?

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

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