Почему не нужно украсить «Const Char *» с «внешним», когда обмениваемся он пересекает несколько файлов

StackOverflow https://stackoverflow.com//questions/24043974

  •  21-12-2019
  •  | 
  •  

Вопрос

При чтении книг 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 ";"Я думаю, что компилятор игнорирует его, потому что инициализация означает, что вы фактически определяете переменную.

Подробнее: http://en.wikipedia.org/wiki/external_variable

.
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top