gpt4 book ai didi

c++ - 为什么在两个不同的 cpp 文件中定义具有相同名称的类时没有链接器错误?

转载 作者:搜寻专家 更新时间:2023-10-31 01:41:14 24 4
gpt4 key购买 nike

大家好!

请考虑以下代码和平:

   $ cat a.cpp
#include <stdio.h>

struct A
{
void foo() { printf("a.cpp: A::foo()\n");}
};

void fooA()
{
A a;
a.foo();
}

$ cat b.cpp
#include <stdio.h>

struct A
{
void foo() { printf("b.cpp: A::foo()\n");}
};

void fooB()
{
A a;
a.foo();
}

$ cat main.cpp
void fooA();
void fooB();

int main()
{
fooA();
fooB();
return 0;
}

$ g++ main.cpp a.cpp b.cpp

$ ./a.out
a.cpp: A::foo()
a.cpp: A::foo()

如您所见,链接器没有警告或错误,但在运行时我们收到的不是我们预期的。我在 gcc 4.8.1 和 msvc 2013 上检查了它。使用简单的自由函数链接器将在这种情况下引发错误。但如果它不是类的方法。

为什么会这样?

最佳答案

在类定义中定义的函数是隐式内联的,因此您可以在多个翻译单元中定义它们。

定义必须相同,但不需要编译器进行诊断,因为一次处理一个单元时不可能诊断。你违反了那个规则,给出了未定义的行为。

要对不同翻译单元中的不同实体使用相同的名称,您可以将每个实体放在不同的命名空间中,或者放在翻译单元本地的未命名命名空间中:

namespace /* optional name */ {
class A {
// whatever you want
};
}

关于c++ - 为什么在两个不同的 cpp 文件中定义具有相同名称的类时没有链接器错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28749179/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com