2016-02-04 4 views
1

Зачем нужен следующий код? Когда переменная 'num' получает значение?Что делает ключевое слово 'extern', что делает следующий код законным?

#include <stdio.h> 

extern int num; 

void main() 
{ 
    printf("%d", num); //prints 3 
} 

int num = 3; 

Пример: Live Code

+4

Если я удалю 'extern', в чем проблема? –

+0

Вы когда-нибудь использовали 'extern' для использования переменной в нескольких файлах? Это работает одинаково, но в одном файле. – immibis

+0

@SouravGhosh код не компилируется – Nemmy

ответ

2

В коде

extern int num; 

называется декларации. OTOH,

int num = 3; 

- это определение с явной инициализацией. Это заявление устанавливает значение. Это значение определяется во время компиляции и устанавливается как раз перед тем, как main() начинает выполнение.

Это указано, void main() должно быть int main(void), по крайней мере, соответствовать стандарту.

+0

OP спрашивает, когда. Ответ «перед« main »работает». –

+0

Да, я знаю разницу между объявлением и определением, но здесь дело в том, что 'num' объявляется после вызова main; на самом деле, если вы удалите ключевое слово extern, оно не будет скомпилировано! – Nemmy

+0

Здесь он похож на прототип функции. «Extern» сделал его доступным, хотя его значение (реализация) было определено позже. Компилятор гарантировал, что его значение задано до запуска 'main', даже если оно определено в исходном файле. –

0

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

Если вы удалите extern из своего кода, вы будете определять num дважды, что не допускается. Чтобы избавиться от объявления extern, просто поместите свой int num = 3; в начало вашего файла.

2

Это работает, потому что вы объявили num так что он может быть назван в коде функции, и потому, что вы определены его в области видимости пространства имен, так что он инициализируется во время статической инициализации, которая как раз перед main является казнены.

В этом смысле ваша программа в настоящее время написано в основном неотличимы от следующего:

#include <stdio.h> 

int num = 3; 

void main() 
{ 
    printf("%d", num); //prints 3 
} 

«Где» инициализируем переменная не имеет особого значения, до тех пор, как происходит во времени, прежде чем пытаться использовать его.

Кстати, вы должны сделать main return int, а не void.

1

extern отмечает объявление переменной, которое определено позже. Определение, часть int num = 3;, является тем, что фактически распределяет память для переменной и устанавливает ее значение (она также удваивается как объявление). C/C++ объявляются перед использованием, если вы этого не сделали extern int num;, то num не будет объявлен в том месте, в котором вы его используете. Разумеется, вы также можете отказаться от линии extern и переместить определение num до main().

Здесь есть две вещи. Во время компиляции num должен быть объявлен в точке исходного файла перед любым использованием. Что касается того, когда он получает свое значение, это происходит во время загрузки программы.Все переменные в области файлов (вне любых функций), такие как num, имеют выделенную память и их значения, если вызывается инициализация до main(). Если им не дано значение в их определении, они могут содержать что угодно, поэтому не делайте никаких предположений о значении неинициализированных переменных. Вы также не можете делать какие-либо предположения о том порядке, в котором они инициализированы, поэтому не обращайтесь к другим переменным области видимости файла при инициализации такой переменной.

Смежные вопросы