Защита заголовка не позволяет компилятору дважды обрабатывать файл заголовка (что может привести к бесполезным ошибкам, так как переопределение класса недопустимо, если у вас есть его определение).
Если в заголовочном файле есть что-то, для чего на самом деле компилятор должен сгенерировать код (или данные), то , что будет иметь место в каждом объектном файле.
Затем компоновщик должен разобраться с этим, что может привести либо к ошибке компоновщика (если, например, вы включили код для функции, не говоря, что он встроенный, что привело к 2 экземплярам одной и той же функции), или не проблема (когда вы заявили, что указанная функция встроена, в этом случае компоновщик выберет только одну).
В основном, заголовки содержат только прототипы функций (которые не генерируют код), определения классов (которые не генерируют код), определения встроенных функций или внешние ссылки. Последние 2 из них будут генерировать вещи в объектном файле, которые должны обрабатываться компоновщиком.