const char a='4';
означает
char const a = '4';
, который можно прочитать в обратном направлении, так как & ldquo; 4 является начальным значением для a
, которое является константой char
& rdquo;.
Поскольку это a
является константой, оно имеет внутреннюю связь (т. Е. Оно не подвергается воздействию других единиц перевода).
С другой стороны,
const char *a="asdfgh";
означает
char const * a = "asdfgh";
, который вы можете прочитать назад как & ldquo; "asdfgh" - это массив, используемый для инициализации a
, который является указателем на константу char
& rdquo;.
В этом случае a
само по себе не является const
, и поэтому не получает внутреннюю связь по умолчанию: она имеет внешнюю связь .
Когда вы включаете свой заголовок в две или более единиц перевода, вы, следовательно, получаете два или более глобальных и различных объекта, называемых a
, что нарушает Правило единого определения C ++ (на него часто ссылаются) как просто ODR ).
Одно из лекарств - сделать a
само по себе const
,
char const * const a = "asdfgh";
Теперь попробуйте прочитать , что в обратном направлении, чтобы понять это.