2013-08-20 2 views
13

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

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

  1. Вне всех функций,

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

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

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

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

См [Что 'extern' переменные в C] (http://stackoverflow.com/questions/1433204/what-are-extern-variables- in-c /) для обширной дискуссии по этому вопросу. Объявление должно быть в заголовке, чтобы оно было написано только один раз - это означает, что вы можете изменить его гораздо легче, чем если двадцать экземпляров декларации в двадцать функций в шести исходных файлах. Оба 'a.c' и' b.c' включают заголовок - он включен в 'a.c', чтобы убедиться, что объявление соответствует определению. Оба варианта, которые вы показываете, являются «технически правильными»; они работают так, как вы хотите. Однако это не желательно. –

ответ

4

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

// 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 вне всех функций (ваше первое предложение).

+0

Спасибо Юлиан, Лидонг и Грижеш. Думаю, у меня есть все, что я хочу. :) –

+0

@WangTuma ваш прием Ван Тума! и ваш прием на SO (новый пользователь!). –

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

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

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

      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); 
      } 
      
4

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

// 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); } 
+0

Это правильный/лучший подход. –