Если два файла C++ имеют разные определения классов с тем же именем, тогда, когда они компилируются и связаны, что-то выкидывается даже без предупреждения. Например,Такое же имя класса в разных файлах на C++
// a.cc
class Student {
public:
std::string foo() { return "A"; }
};
void foo_a()
{
Student stu;
std::cout << stu.foo() << std::endl;
}
// b.cc
class Student {
public:
std::string foo() { return "B"; }
};
void foo_b()
{
Student stu;
std::cout << stu.foo() << std::endl;
}
После компиляции и связаны друг с другом с помощью G ++, как будет выводить «А» (если a.cc предшествует b.cc в порядке командной строки).
Аналогичная тема here. Я вижу, что пространство имен решит эту проблему, но я не знаю, почему компоновщик даже не снимает предупреждение. И если одно определение класса имеет дополнительную функцию, которая не определена в другой, скажем, если b.cc обновляется:
// b.cc
class Student {
public:
std::string foo() { return "B"; }
std::string bar() { return "K"; }
};
void foo_b()
{
Student stu;
std::cout << stu.foo() << stu.bar() << std::endl;
}
Тогда stu.bar() работает хорошо. Спасибо всем, кто может рассказать мне, как работает компилятор и компоновщик в такой ситуации.
В качестве дополнительного вопроса, если классы определены в заголовочных файлах, должны ли они всегда быть обернуты безымянным пространством имен, чтобы избежать такой ситуации? Есть ли побочные эффекты?
Может быть, когда он скомпилирован, компилятор смотрит и видит, что уже существует класс «ученик», поэтому он игнорирует его? – Rhexis