为什么C++允许在每个文件中定义同名但定义不同的类?

ca1c2owp  于 2023-04-01  发布在  其他
关注(0)|答案(1)|浏览(95)

此问题在此处已有答案

Same class name in different C++ files(4个答案)
What exactly is One Definition Rule in C++?(1个答案)
C++ Multiple classes with same name(5个答案)
Why does the same class being defined in multiple .cpp files not cause a linker multiple definition error?(2个答案)
12小时前关门了。
我已经读过这篇Same name structure with different definition in C但是它没有弄清楚我的问题。像函数一样分离声明和定义不是更好吗?因为这是可能的,下面的代码可以工作。

//AAA.c
class AAA
{
public:
    // even if AAA only have 1 member variable, it works.
    char i;
    char f;
    char d;
    char e;
    void PrintAYAYA();
};

void AAA::PrintAYAYA() { std::cout << "AYAYA\n"; };
void GetAAAWhatHappen(AAA a)
{
    char* p = (char*)&(a.i);
    char arr[4]{};
    for (int i = 0; i < 4; ++i)
        std::cout << (int)*(p + i) << std::endl;

}

//main.c 
class AAA
{
public:
    int i = 0x12345678;
    void PrintAYAYA();
};

void GetAAAWhatHappen(AAA a);
int main()
{
    AAA a;
    a.PrintAYAYA();
    GetAAAWhatHappen(a);
}

尽管有明显不同的定义,但上面的代码运行是因为它们共享相同的名称
还有一个问题,编译器链接目标文件创建exe文件后,在执行exe文件时,计算机如何区分同名但定义不同的类?

e1xvtsh3

e1xvtsh31#

你的代码不是有效的C++。不是所有无效的C++都会产生编译器错误,你只是得到了不可预测的行为。你的代码违反了一个定义规则:
在程序中,下列各项可以有多个定义:类类型[...],只要满足以下所有条件:

  • 每个定义由相同的内标识序列组成(通常出现在同一个头文件中)
  • [...]

如果满足所有这些要求,程序的行为就好像整个程序中只有一个定义。否则,程序是病态的,不需要诊断
突出显示的部分可能令人惊讶,但在C中很常见。“格式错误”意味着你的程序被破坏了。“不需要诊断”意味着C编译器不需要告诉你这个事实。这就是你所看到的。

相关问题