Ваши целочисленные константы имеют внутреннюю связь, поскольку они объявлены const
.В частности, из-за этого они не выдают несколько ошибок определения, даже если этот заголовочный файл включен в несколько единиц перевода.
Ваши строковые указатели имеют внешнюю связь, поскольку они не заявлено const
.Из-за этого вы получите несколько ошибок определения, когда этот заголовочный файл включен в несколько блоков перевода.Вам не разрешено иметь несколько не встроенных определений объектов с внешними связями в вашей программе.
Если вы предполагали, что ваши строковые указатели будут const
, так же, как ваши целые числа, вы должны были объявить их таковыми
const char *const text = "whatever";
Обратите внимание, где в объявлении помещается дополнительный const
.
Но если вы хотели, чтобы ваши указатели были модифицируемыми глобальными переменными, то этодругая история.В компиляторах C ++ 17 вы можете достичь этого, просто добавив inline
inline const char *text = "whatever";
В pre-C ++ 17 вам придется перепрыгивать через более сложную комбинацию обручей с объявлениями extern
в заголовочном файле.(Выполните поиск по темам о глобальных переменных - это хорошо освещено в SO.)
PS Включающие охранники не имеют ничего общего с предотвращением ошибок компоновщика.