2016-09-03 8 views
0

Я читал о глобальных переменных в C. У меня есть два вопроса о ключевом слове extern.Поведение ключевого слова extern в C

  1. Почему требуется инициализация переменных, которые объявлены глобально сextern ключевое слово?
  2. Почему инициализация не требуется для переменных, объявленных глобально без ключевое слово extern?

Пожалуйста, объясните разницу.

+0

Вы уверены, что вы были в понятиях? Чаще всего 'extern SomeType some_variable;' используется без инициализации в файле заголовка для объявления переменной, а 'SomeType some_variable = {...};' используется для определения и инициализации переменной в одном исходном файле. Это похоже на то, что вы утверждаете. См. [Как использовать 'extern' для обмена переменными между исходными файлами в C] (http://stackoverflow.com/questions/1433204/how-do-i-ex-extern-to-share-variables-between-source -files-in-c /) для подробных подробностей. Прекратите чтение в одной из двух ранее остановленных точек (вы увидите). –

+0

Инициализация * не * требуется для переменной 'extern'. переменная 'extern' явно * не * определена в этом файле, а является ссылкой на переменную, определенную в каком-либо другом объектном файле, который будет связан с этим. –

ответ

-1

Почему требуется инициализация переменных, объявленных глобально с ключевым словом extern?

Когда мы используем Экстерн ключевых слова с неинициализированного переменной компилятором думает переменные инициализируются где-то в программе. Например:

#include <stdio.h> 
extern int i; //extern variable 
int main() 
{ 
    printf("%d",i); 
    return 0; 
} 

Выход:

undefined reference to `i' 

потому, память не выделяется для этих переменных. Следовательно, во втором случае компилятор показывает ошибку неизвестного символа i. Вот почему выделяет память для внешних переменных, необходимо инициализировать переменные. Мол,

extern int i; 
int i = 10; 

Почему инициализация не требуется для переменных, объявленных глобально без экстерном ключевого слова?

Когда мы не используем Экстерн ключевое слово, то компилятор инициализируется его значение по умолчанию. Например:

#include <stdio.h> 
int i; //By default it is extern variable 
int main() 
{ 
    printf("%d",i); 
    return 0; 
} 

Выход:

0 

потому, Компилятор будет автоматически инициализировать значение по умолчанию для переменной Экстерн.

2
  1. Почему требуется инициализация переменных, объявленных глобально с помощью extern?

    // declarations 
    extern int foo1; 
    extern int foo2; 
    

Инициализация не требуется. Глобальные переменные, не имеющие явной инициализации, инициализируются, как показано ниже.

Объявление переменная не определение it. В некоторых единицах переменная, если она используется, должна быть определена.

  1. Почему инициализация не требуется для переменных, объявленных глобально без extern?

    // declaration and definition - no initialization 
    int foo3; // Same functional effect as int foo3 = 0; 
    // declaration and definition - with initialization 
    int foo4 = 5; 
    

Глобальные переменные, не имеющие явной инициализации инициализируется, как показано ниже.


C11dr 6.7.9 Initialization

... Если объект, который имеет длительность статического или потока хранения не инициализируется явно, то:

- если он имеет тип указателя, он инициализируется к нулевому указателю;
- если он имеет арифметический тип, он инициализируется (положительным или без знака) нулем;
- если он является агрегатом, каждый элемент инициализируется (рекурсивно) в соответствии с этими правилами, и любое заполнение инициализируется нулевыми битами;
- если это объединение, первый именованный элемент инициализируется (рекурсивно) в соответствии с этими правилами, и любое заполнение инициализируется нулевыми битами;

+0

@ M.M Добавлены сведения о инициализации. – chux