Подтвердить что ты не робот

Объявление переменной и определение

Я читал некоторую информацию об экстернах. Теперь автор начал упоминать объявление и определение переменной. По заявлению он ссылался на случай, когда: если объявлена ​​переменная пространство для него не выделено. Теперь это привело меня в замешательство, потому что я думаю МОСТ того времени когда я использую переменные в C, я на самом деле как определяю, так и декларирую их правильно? то есть.,

int x; // definition + declaration(at least the space gets allocated for it)

Тогда я думаю, что только случаи в C, когда вы объявляете переменную, но не определить, когда вы используете:

extern int x; // only declaration, no space allocated

Я правильно понял?

4b9b3361

Ответ 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.                                     .