Какая польза от static/extern в исходных файлах?

У меня очень неоднозначное представление о том, что происходит, когда я компилирую много файлов — в основном, когда речь идет о видимости вещей из одного файла в другой. Из того, что я прочитал, static ограничивает область действия переменной или функции самим файлом. extern делает наоборот. Исходя из этого, я ожидаю, что смогу просто прочитать глобальный внешний вид из любого файла. На практике это не работает, как показано ниже.

main.c:

#include <stdio.h>

int main(void){
    printf("%d\n", b); // b is extern global
    return 0;
}

a.c:

static int a = 40;

до н.э.:

extern int b = 20;

Я даже не могу скомпилировать:

> gcc main.c a.c b.c -o test
b.c:1:12: warning: ‘b’ initialized and declared ‘extern’ [enabled by default]
 extern int b = 20;
            ^
main.c: In function ‘main’:
main.c:4:20: error: ‘b’ undeclared (first use in this function)
     printf("%d\n", b); // b is extern global

person Pithikos    schedule 15.01.2015    source источник
comment
Рекомендуется хранить все внешние переменные в файлах .h и включать их в необходимые файлы .c.   -  person Gopi    schedule 15.01.2015


Ответы (3)


Вы все делаете неправильно. Когда мы пишем extern int b, это означает, что была объявлена ​​переменная целочисленного типа с именем b. И мы можем делать это объявление столько раз, сколько необходимо. (помните, что объявление может быть сделано любое количество раз). Экстернируя переменную, мы можем использовать переменные в любом месте программы, при условии, что мы знаем их объявление, и переменная где-то определена.

Правильный способ

main.c:

#include <stdio.h>

extern int b;   //declaration of b
 int main(void){
    printf("%d\n", b); // using b 
    return 0;
}

до н.э.:

int b = 20;   //definition here

и скомпилировать как gcc main.c b.c -o test

Я опустил a.c, так как в этом примере он ничего не делал. Чтобы узнать больше о экстернах, посетите этот сайт. У него очень хороший контент http://www.geeksforgeeks.org/understanding-extern-keyword-in-c/

person Ankur    schedule 15.01.2015
comment
Спасибо, это было самое простое объяснение связки :) - person Pithikos; 15.01.2015
comment
Добро пожаловать рад помочь :) - person Ankur; 15.01.2015
comment
extern int b; зачем нам extern здесь глобальные переменные по умолчанию extern - person Gopi; 15.01.2015
comment
Посмотрите на ссылку, которую я показал, и комментарий Р. Саху. - person Ankur; 15.01.2015
comment
@Shan Какой комментарий, и даже если вы удалите внешний код, ваш код не изменится, так зачем он нужен и каково его значение? - person Gopi; 15.01.2015
comment
@Gopi проверьте ответ Извините R Sahu. И даже если вы удалите extern, ваш код не изменится, что это значит? - person Ankur; 15.01.2015
comment
@Shan Правда, extern установлено по умолчанию. Однако явная ясность делает вещи более ясными, так что в данном случае это просто соглашение. - person Pithikos; 16.01.2015

Переменная может использоваться, если она либо объявлена, либо определена.

В main.c нет объявления b. Можете добавить

extern int b;

в main.c, чтобы компилятор мог использовать b. Это объявляет компилятору, что b определено где-то еще и имеет тип int.

В b.c можно удалить слово extern. Если не указано static, по умолчанию используется extern.

int b = 20;

Даже в b.c вы можете использовать объявление вверху файла и определить его внизу.

extern int b;

//
// ... code that uses b
//

int b = 20;

Строка extern просто объявляет переменную. Последняя строка определяет переменную.

person R Sahu    schedule 15.01.2015

Когда у вас есть переменная extern, компилятор знает, что объявление этой переменной находится здесь, а определение — где-то еще.

Таким образом, вы можете сделать, как показано ниже

некоторые.h

   extern int b;  /* Declare the variable */

до н.э.

   int b = 20;  /* Define the variable */

main.c

    #include<some.h>

    int main()
    {
       printf("%d\n",b);  /* Use the variable b */

       return 0;
    }

При этом теперь файл main.c знает объявление b, так как есть файл some.h.

person Gopi    schedule 15.01.2015
comment
в том числе some.h не обязательно, я думаю - person Ankur; 15.01.2015