Подтвердить что ты не робот

Не является ли константная переменная в пространстве имен неявно статичной?

Я знаю, что static const int x = 42; в области пространства имен эквивалентно const int x = 42;, потому что переменные const неявно static (они должны быть объявлены extern для внешней привязки). Каждая единица перевода, включающая это объявление, получает локальную копию x.

Это относится только к определенным (возможно, целым?) типам? У меня есть следующий код в файле заголовка:

namespace XXX {
    static const char* A = "A";
    static const char* B = "B";
    static const char* C = "C"; // and so on
}

(ПОЖАЛУЙСТА, напишите мне, почему я не должен использовать строки стиля C - это устаревший код)

Этот заголовок включен из нескольких исходных файлов, и все в порядке (каждый блок компиляции получает свою собственную копию этих char*). Я бы подумал, что я могу удалить static из них, поскольку он избыточен, но когда я это делаю, я получаю ошибки ссылок о символах, которые уже определены в другом объекте. Что мне здесь не хватает? Являются ли эти const char* не неявно статическими?

4b9b3361

Ответ 1

В вашем примере вы создаете указатель на константу (блок) char, а не на создание указателя константы на char. Таким образом, ваш указатель не является постоянным и поэтому не является неявным статичным.

Вам нужно объявить x как const char *const A, который создает константный указатель на константу (блок) char.