Страницы

Поиск по вопросам

пятница, 12 октября 2018 г.

Определение 2-х одинаковых классов не даёт ошибки

//Файл A.cpp class A { public: int func( int i ) { return i*i; } };
//Файл Test.cpp #include using namespace std;
class A { public: int func( int i ) { return i*i*i; } };
int main() { A a; cout<Вопрос в том, почему нет ошибки времени компиляции? Ведь имеется два определения класса с именем А. Программа работает - выводит 8.
Дополню вопрос. Если переписать файл "A.cpp" так:
class A { public: int func( int i ); };
int A::func( int i ) { return i*i; }
То ошибка будет!!!
С функциями аналогичная ситуация. Приведённый ниже код работать не будет.
//A.cpp int func( int i ) { return i*i; }
//Test.cpp #include using namespace std;
int func( int i ) { return i*i*i; }
int main() { cout<Всё это меня как-то запутывает.


Ответ

Согласно стандарту языка (правилу ODR) классы с external linkage (внешним связыванием), определенные в нескольких единицах трансляции, должны быть определены одинаково во всех этих единицах трансляции. Но диагностики этого не требуется.
Точно так же, по ODR, inline-функции с external linkage, определенные в нескольких единицах трансляции, должны быть определены одинаково во всех этих единицах трансляции. Но диагностики этого не требуется.
В вашем исходном примере наличествуют как раз две таких сущности - класс с external linkage и inline-функция с external linkage.
Т.е. спецификация языка требует, чтобы эти сущности были определены одинаково во всех единицах трансляции, но следить за этой одинаковостью - в общем случае ваша задача. Продвинутый компилятор может помочь вам ловить такие ошибки, но это просто вопрос качества реализации.
Как только ваша функция перестала быть inline, диагностика для нарушений ODR для такой функции сразу же формально потребовалась и компилятор ее успешно вам предоставил.

Комментариев нет:

Отправить комментарий