Почему не нужно украсить «Const Char *» с «внешним», когда обмениваемся он пересекает несколько файлов
Вопрос
При чтении книг C ++ я узнал, что для совместного использования Const Variable / Object Cross несколько файлов необходимо определить переменную Const один раз в одном из файлов и объявляю его в каждом исходном файле, где он используется.Например,
в file1.cpp, мы определяем переменную Const INT глобально, как
extern const int ca = 100;
.
в файл2.cpp, где мы его используем, мы объявляем эту переменную, как
extern const int ca;
.
Приведенная выше Конвенция имеет смысл для меня.Однако при приезжении на Const Char Pointer нам не нужно определять его использование Extern, и он может быть очень хорошо поделиться несколькими файлами.Почему такое происходит?Например,
в file1.cpp, мы определяем переменную указателя Const Char Global, как
const char *cstr = "hello";
.
в файл2.cpp, где мы его используем, мы объявляем эту переменную, как
extern const char *cstr;
.
Чтобы сделать мой вопрос более конкретным, почему CSTR может использоваться в файл2.cpp, даже если он не украшен «внешним» в File1.cpp?
Большое спасибо
Решение
Проблема является одним из связей.Когда вы определяете переменную в Область пространства имен, и нет предыдущей декларации, которая устанавливает связь, внешний удар, если объект не const, внутренний, если это так.Поэтому, когда вы пишете:
int const ca = 100;
.
В исходном файле ссылка будет внутренним, а предприятие
(Переменная) ca
относится к этому переводу
Блок.Если вы написали:
int ca = 100;
.
Связь будет внешним, так что
extern int ca;
.
в другом блоке перевода будет относиться к той же переменной.
и, конечно, когда вы пишете:
char const* cstr = "hello";
.
Вы определяете указатель, который не Const (хотя это указывает на const).
Конечно, нормально, вы бы объявили переменные в заголовке, с генеракодицетагкодом, так что будет предыдущая декларация, когда вы Определите переменные, и это первое объявление, которое устанавливает связь.
Другие советы
extern используется, чтобы сделать его явным, что оператор "Extern const char * cstr;"это декларация, а не определение, CSTR определяется где-то еще.Если вы сделали "const char * cstr;"Компилятор интерпретирует, что как определение, и вы получите 2 CSTR.
Если вы применяете extern на "const char * cstr=" hello ";"Я думаю, что компилятор игнорирует его, потому что инициализация означает, что вы фактически определяете переменную.
.