Одинаковое имя класса в разных файлах 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» (если a.cc предшествует b.cc в порядке командной строки).

Похожая темаВот, Я вижу, что пространство имен решит эту проблему, но я не знаю, почему компоновщик даже не выдает предупреждение. И если одно определение класса имеет дополнительную функцию, которая не определена в другом, скажем, если 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 () работает хорошо. Спасибо всем, кто может рассказать мне, как компилятор и компоновщик работают в такой ситуации.

В качестве дополнительного вопроса, если классы определены в заголовочных файлах, должны ли они всегда заключаться в безымянное пространство имен, чтобы избежать такой ситуации? Есть ли побочные эффекты?

Ответы на вопрос(5)

Ваш ответ на вопрос