спецификатор класса внешнего хранилища - PullRequest
2 голосов
/ 22 октября 2010

Раздел 7.1 Стандарта C ++ упоминает о 'extern' как о спецификаторе класса хранения.

N3126 - "Спецификатор extern может применяться только к именам переменных и функций. Спецификатор externне может использоваться в объявлении членов класса или параметров функции. Для связи имени, объявленного со спецификатором extern, см. 3.5. [Примечание: ключевое слово extern также может использоваться в явных экземплярах и спецификациях связи, но этоне спецификатор класса хранения в таких контекстах. —конец примечания]

Я понимаю об этом ключевом слове, и оно используется в контексте «спецификации связи», но я не могу понятьиспользование 'extern' в качестве спецификатора хранилища.

  1. Разве все имена 'extern' не имеют статической продолжительности хранения?
  2. Если ответом на 1 является «да», то почему такая избыточность? C Совместимость?

Ответы [ 3 ]

6 голосов
/ 22 октября 2010

extern - это спецификатор класса хранения .Это просто факт языковой грамматики.extern влияет на семантику программы в зависимости от того, где она используется.Это не имеет одинакового эффекта везде.Он влияет на продолжительность хранения и связь объектов, а также помогает определить, являются ли некоторые объявления также определениями.

Например:

int a; // Ex1

extern int b; // Ex2

Например, если Ex1 и Ex2 где в глобальном масштабе тогда они оба будут ссылаться на объекты со статической продолжительностью хранения и внешней связью.В C ++, тем не менее, первое будет определением (предварительное определение в C), а второе - нет.В этом примере extern не изменил продолжительность хранения или связь объявленного объекта.

Если бы Ex1 и Ex2 произошли в теле функции, тогда a будет ссылаться на объект с автоматическим хранениемдлительность и отсутствие связи, но b будет относиться к объекту с внешней связью и статической продолжительностью хранения.В этом примере extern повлиял на значение объявления как в отношении связывания, так и в отношении продолжительности хранения и того, является ли оно определением.

Наконец, в C ++ приведен пример, где единственный эффект extern меняет связь с внутренней на внешнюю.

const int c = 5; // static storage duration, internal linkage

extern const int d = 10; // static storage duration, external linkage
2 голосов
/ 22 октября 2010

Это не на самом деле спецификатор хранилища как таковой.Он предшествует имени переменной почти так же, как другие спецификаторы хранилища, но все, что он делает, - это закрывает компилятор и сообщает компоновщику, что у него больше работы.

0 голосов
/ 31 мая 2018

Ключевое слово Extern сообщает компилятору, что переменная extern существует (или функция), даже если компилятор не может найти ее в компилируемом файле Вызывает внешнюю связь

...