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

Объявить переменную extern внутри функции C?

Я определяю переменную в файле C: int x, и я знаю, что я должен использовать extern int x, чтобы объявить ее в других файлах, если я хочу использовать ее в других файлах.

Мой вопрос: где я должен объявить его в других файлах?

  • Вне всех функций

    // in file a.c:
    int x;
    
    // in file b.c:
    extern int x;
    void foo() { printf("%d\n", x); }
    
  • внутри функции (-ов), которая будет ее использовать?

    // in file b.c:
    void foo() {
       extern int x;
       printf("%d\n", x);
    }
    

Мои сомнения:

  • Какой из них правильный?, или
  • Что предпочтительнее, если оба правильны?
4b9b3361

Ответ 1

  • Оба правильные.

  • Какой из них предпочтительнее, зависит от области использования переменной.

    • Если вы используете его только в одной функции, тогда объявите его в функции.

      void foo() 
      {
           extern int x;   <--only used in this function.
           printf("%d",x);   
      }
      
    • Если он используется более чем одной функцией в файле, объявите ее как глобальное значение.

      extern int x;   <-- used in more than one function in this file
      void foo()
      {
          printf("in func1 :%d",x);   
      }    
      void foo1() 
      {
          printf("in func2 :%d",x);   
      }  
      

Ответ 2

Предположим, если вы объявляете внутри функции:

// in file b.c:
void foo() {
    extern int x;
    printf("%d\n", x);
}
void foo_2() {
    printf("%d\n", x);  <-- "can't use x here"
}

тогда x отображается локально внутри функции foo(), и если у меня есть какая-либо другая функция, скажите foo_2(), я не могу получить доступ к x внутри foo_2().

Если вы объявляете x снаружи перед всеми функциями, то он будет доступен/доступен глобально в полном файле (все функции).

  // in file b.c:
  extern int x;
  void foo() { printf("%d\n", x); }
  void foo_2() { printf("%d\n", x); }  <--"visible here too"

Итак, если вам нужна x только в одной функции, вы можете просто объявить внутри этой функции, но если x использует в нескольких функциях, тогда объявляйте x вне всей функции (ваше первое предложение).

Ответ 3

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

// in file a.c:
int x;

// in file b.h  //   make a header file and put it in 
                //   the same directory of your project and every
                //   time you want to declare this variable 
                //   you can just INCLUDE this header file as shown in b.c
extern int x;

// in file b.c:
#include "b.h"
void foo() { printf("%d\n", x); }