2015-07-05 1 views
0

Скажем, я объявляю следующую переменную:Декларирование и присвоения переменных с области файла в C

int num; 
num = 0; 

int main(void) 
{ 
     /* ... */ 
     exit(EXIT_SUCCESS); 
} 

Компилятор придраться num быть заявлен и что он будет по умолчанию тип int. Этого не происходит, когда я делаю все это в одном шаге:

int num = 0; 

или, если я перееду назначение в main():

int main(void) 
{ 
     num = 0; 
     /* ... */ 
     exit(EXIT_SUCCESS); 
}  

Я когда-то читал объяснение такого поведения, но я не могу найти его больше , Может ли кто-нибудь обновить меня снова.

Я компиляция с

gcc -std=c11 -O2 -g -pedantic -Wall -c -fmessage-length=0 -v 
+6

Вы намерены 'Num = 0;' как заявление; заявления могут относиться только к функциям. Вместо этого компилятор интерпретирует его как объявление переменной, но без типа. –

+0

@ Kerrek SB: Во-первых, нет такой вещи, как * заявление декларации * в C. В языках C заявления не являются утверждениями. Объявления всегда являются просто декларациями. * Заявления о декларации * существуют в C++, но не в C. Во-вторых, даже в C++ * заявления * должны находиться внутри функций. Даже в объявлениях на C++, сделанных в области пространства имен, все еще есть только * декларации *, а не * заявления декларации *. – AnT

+0

@ АНТ: Вы правы, удалены. Я этого никогда не понимал. В C++ оператор объявления содержит только небольшое подмножество всех возможных объявлений. (В частности, голые точки с запятой, похоже, не действительны в области пространства имен в C++.) –

ответ

5

num = 0; является утверждением, что может существовать только внутри функции. Он не может существовать в глобальном масштабе.

Если вы положили инструкцию вне функции, это неправильно и не разрешено. Просто подумайте об этом, если у вас есть заявление за пределами всех функций, в глобальной области, когда и как этот оператор может быть выполнен? Итак, это неправильно.

Особый случай, инициализация при определении допускается в виде int num = 0;

+0

Просто добавление: инициализатор для глобальной переменной должен быть константой _constant_ по той же причине: ее нужно оценивать во время компиляции , – Olaf