Почему включение одного заголовочного файла в два файла CPP не приводит к ошибке переопределения?
Допустим, у меня есть такой заголовочный файл:
ABC.h
class A {
int d = 5;
int e = 6;
};
Затем я включаю ABC.h в два исходных файла CPP. Не было бы тогда, когда компоновщик связал бы блоки компиляции вместе, я бы в итоге получил 2 определения класса A? Но тогда почему компоновщик не жалуется, когда я проверяю этот эксперимент? Я сбит с толку.
Я компилирую с использованием Visual Studio 2017.
1 ответ
Решение
Есть два возможных варианта ответа на этот вопрос.
- Там нет ошибки, потому что в противном случае было бы невозможно создать любую полезную программу. Такие повторяющиеся определения классов в нескольких единицах перевода нормальны и ожидаемы в каждой программе. Таким образом, язык определяется таким образом, что он просто работает.
- Там нет ошибки, потому что это определение класса не создает глобальные символы, которые могут вызвать несколько ошибок определения. Глобальные символы обычно создаются путем определения не встроенных переменных или функций с внешней связью. В этом заголовочном файле нет таких определений. Классы и их нестатические члены не имеют связи.