2016-07-11 11 views
2

Что такое время жизни переменной p, если он объявлен как extern int p;Срок службы переменной «extern» в C?

Это статический, динамический, автоматический или он не имеет жизни, потому что нет никакой связи?

+4

Срок службы как статический. – i486

+0

@ i486: Пожалуйста, не отвечайте в разделе комментариев. –

+1

Раздел @LightnessRacesinOrbit Answers требует больше слов :) – i486

ответ

2

or it has no lifetime because there is no linkage?

Ключевое слово extern означает, что переменная только объявлена, что никакое хранение не выделяется для него [1].

Ключевое слово extern не имеет никакого отношения к времени жизни переменной. Тем не менее, время жизни/область действия переменной зависит только от того, где именно это происходит в коде.

Примечание

[1] Когда extern используется с заданием, как

extern int i=5; 

ключевое слово extern игнорируется, и обычные правила сферы применимы к переменной

[2] Пожалуйста, проверьте мой другой [ answer ].


Interesing: Как Стивен Прата в своей книге C++ Primer Plus помещает это ключевое слово extern означает "Использовать переменную с таким именем, ранее определенным внешним"

+0

Вы говорите, что время жизни переменной зависит только от того, где именно это происходит в коде. Затем это означает, что если переменная объявлена ​​в некоторой функции, она имеет автоматическое время жизни. Ответы других предполагают, что переменная extern имеет статический срок службы. Таким образом, это не должно быть только статическое время жизни? – user300046

+0

@ lightness-races-in-orbit: Я хотел сказать 'decl-only'. но благодаря этому это имеет смысл. – sjsam

+1

@display_error: Нет такой вещи, как «внешняя переменная», и другие ответы говорят об этом. –

8

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

С другой стороны, объявление переменной extern может ссылаться только на глобальную переменную, которая имеет статическую продолжительность хранения.

1

C11 проект раздела 6.2.4 говорит

An object whose identifier is declared without the storage-class specifier _Thread_local , and either with external or internal linkage or with the storage-class specifier static , has static storage duration. Its lifetime is the entire execution of the program and its stored value is initialized only once, prior to program startup.

+1

Nice. В качестве побочного примечания ключевое слово 'static' предназначено только для привязки, за исключением случаев, когда оно используется в' block scope'. – sjsam

1

Срок службы программы. Инициализируется один раз во время загрузки или запуска программы. Начальное значение по умолчанию равно 0. Невозможно инициализировать внутри блока.