此问题在此处已有答案:
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文件时,计算机如何区分同名但定义不同的类?
1条答案
按热度按时间e1xvtsh31#
你的代码不是有效的C++。不是所有无效的C++都会产生编译器错误,你只是得到了不可预测的行为。你的代码违反了一个定义规则:
在程序中,下列各项可以有多个定义:类类型[...],只要满足以下所有条件:
如果满足所有这些要求,程序的行为就好像整个程序中只有一个定义。否则,程序是病态的,不需要诊断。
突出显示的部分可能令人惊讶,但在C中很常见。“格式错误”意味着你的程序被破坏了。“不需要诊断”意味着C编译器不需要告诉你这个事实。这就是你所看到的。