Объявление переменной и определение
Я читал некоторую информацию об экстернах.
Теперь автор начал упоминать объявление и определение переменной.
По заявлению он ссылался на случай, когда: если объявлена переменная
пространство для него не выделено.
Теперь это привело меня в замешательство, потому что я думаю МОСТ того времени
когда я использую переменные в C, я на самом деле как определяю, так и декларирую их правильно?
то есть.,
int x; // definition + declaration(at least the space gets allocated for it)
Тогда я думаю, что только случаи в C, когда вы объявляете переменную, но не
определить, когда вы используете:
extern int x; // only declaration, no space allocated
Я правильно понял?
Ответы
Ответ 1
В принципе, да, вы правы.
extern int x; // declares x, without defining it
extern int x = 42; // not frequent, declares AND defines it
int x; // at block scope, declares and defines x
int x = 42; // at file scope, declares and defines x
int x; // at file scope, declares and "tentatively" defines x
Как указано в стандарте C, декларация определяет интерпретацию и атрибуты набора идентификаторов и определение для объекта, заставляет хранилище зарезервировать для этого объекта. Также определение идентификатора является объявлением для этого идентификатора.
Ответ 2
Вот как я рассматриваю его, складывая кусочки и куски, которые я нашел в Интернете. Мое мнение может быть искаженным.
Некоторые основные примеры.
int x;
// The type specifer is int
// Declarator x(identifier) defines an object of the type int
// Declares and defines
int x = 9;
// Inatializer = 9 provides the initial value
// Inatializes
Стандарт C11 6.7 состояния
Определение идентификатора - это объявление для этого идентификатора, которое:
- для объекта, заставляет хранилище быть зарезервированным для этого объекта;
- для функции, включает тело функции;
int main() // Declares. Main does not have a body and no storage is reserved
int main(){ return 0; }
// Declares and defines. Declarator main defines
// an object of the type int only if the body is included.
Нижеприведенный пример
int test(); Will not compile. undefined reference to main
int main(){} Will compile and output memory address.
// int test();
int main(void)
{
// printf("test %p \n", &test); will not compile
printf("main %p \n",&main);
int (*ptr)() = main;
printf("main %p \n",&main);
return 0;
}
extern int a; // Declares only.
extern int main(); //Declares only.
extern int a = 9; // Declares and defines.
extern int main(){}; //Declares and defines. .