Почему включение одного заголовочного файла в два файла CPP не приводит к ошибке переопределения?

Допустим, у меня есть такой заголовочный файл:

ABC.h

class A {
    int d = 5;
    int e = 6;
};

Затем я включаю ABC.h в два исходных файла CPP. Не было бы тогда, когда компоновщик связал бы блоки компиляции вместе, я бы в итоге получил 2 определения класса A? Но тогда почему компоновщик не жалуется, когда я проверяю этот эксперимент? Я сбит с толку.

Я компилирую с использованием Visual Studio 2017.

1 ответ

Решение

Есть два возможных варианта ответа на этот вопрос.

  1. Там нет ошибки, потому что в противном случае было бы невозможно создать любую полезную программу. Такие повторяющиеся определения классов в нескольких единицах перевода нормальны и ожидаемы в каждой программе. Таким образом, язык определяется таким образом, что он просто работает.
  2. Там нет ошибки, потому что это определение класса не создает глобальные символы, которые могут вызвать несколько ошибок определения. Глобальные символы обычно создаются путем определения не встроенных переменных или функций с внешней связью. В этом заголовочном файле нет таких определений. Классы и их нестатические члены не имеют связи.
Другие вопросы по тегам