我在a.cpp中的代码
#include
int a=100;
int main()
{
return 1;
}
在b.cpp中代码
int a=0;
今天刚学了ODR,里面有一句非inline的函数或变量在整个程序中只能有一个定义,但是这里的a已经重定义了,为什么不报错呢
程序的生成要经过名为链接的过程,如果你只是用a.cpp编译链接的话不会报错,如果两者一起链接就会报错
该回答引用GPTᴼᴾᴱᴺᴬᴵ
在C++中,全局变量和函数都有一个“外部链接”属性,表示它们可以在多个源文件中共享。当您在多个源文件中定义具有相同名称的全局变量时,C++编译器会将这些变量视为具有相同的外部链接属性,并将它们合并为一个变量。这个过程被称为“链接”。
·
在您的代码中,您在a.cpp中定义了一个全局变量a,并在b.cpp中也定义了一个名为a的全局变量。然而,由于这些变量具有相同的名称和外部链接属性,编译器会将它们合并为一个变量,而不会产生重定义错误。
·
请注意,如果您将变量a的链接属性设置为“内部链接”(使用static修饰符),则编译器会在每个源文件中都创建一个具有相同名称的变量。这将导致重定义错误。
你运行的是a,又没有引用b,为什么要报错呢