Как объявить глобальную переменную, которая присутствует только в одной функции? - PullRequest
0 голосов
/ 11 августа 2011

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

 void function()
 {
   // if this function is called then declare int a=10; 
   // as global so other function can use this 
 }

Как я могу сделать такую ​​вещь в c?

Ответы [ 6 ]

4 голосов
/ 11 августа 2011

C не работает так - глобальная переменная выделяется во время загрузки и существует на протяжении всей продолжительности программы, независимо от поведения во время выполнения. Если вы действительно должны знать, была ли переменная «установлена», вы можете включить отдельный флаг:

int global_a;
int global_a_has_been_set = 0;

void f()
{
  global_a = 10;
  global_a_has_been_set = 1;
}

void elsewhere()
{
  if (global_a_has_been_set != 0) { /* ... */ }
}

Если вы знаете, что ваша переменная может быть только неотрицательной, то вы можете альтернативно использовать специальное значение часового типа, например -1, чтобы указать, что переменная еще не "установлена".

Скорее всего, вам следует переделать свой дизайн, чтобы вы уже знали другими способами, нужна ли вам переменная.

3 голосов
/ 11 августа 2011

Вы можете определить переменную static внутри функции, тогда она доступна только в этой функции (и сохраняет ее значение между несколькими вызовами):

int increment() {
  static int x = 0; // Initialize with 0
  x++;
  return x;
}

void main() {
  printf("%d\n", increment());
  printf("%d\n", increment());
  printf("%d\n", increment());

  // (unfortunately) x is not available here...
}

Returns:
1
2
3

Каждый раз, когда функция increment()вызванный, он возвратит большее число.

Невозможно использовать переменные вне его области видимости.Таким образом, вы можете либо определить переменную в «глобальной области видимости» (как показано Kerrek SB ), либо статическую переменную в функции (или любую другую область видимости) (как показано выше).Если какая-либо из этих возможностей не подходит для вашей ситуации, я боюсь, что вам следует (радикально) изменить структуру вашего приложения ...

2 голосов
/ 11 августа 2011

C не является динамическим языком - все объявленные переменные существуют (в соответствии с правилами области видимости) всегда.

Вы не можете проверить, была ли переменная объявлена ​​, это работа компилятора, и она выдаст вам ошибку, если вы попытаетесь использовать переменную, не входящую в область действия.

Глобальным переменным выделяется место для них (в сегменте «данные») автоматически при первой загрузке программы.

Следовательно, вы можете только проверить, изменилась ли переменная по сравнению с первоначальным присвоенным значением.

1 голос
/ 11 августа 2011

Нет способа. Вы можете ограничить область действия глобальной переменной одной функцией в файле. Она доступна для всех функций в файле. Однако Вы можете ограничить область действия глобальной переменной только файлом, используя ключевое слово static с имя глобальной переменной.

   file1.c //1st file                     file2.h //2nd file

   #include<file2.h>                     
   main()                                static int a;
   {
   fun();                                 fun()
   }                                      {
                                           printf("%d",a);
                                          }

В этом примере у вас есть два файла file1.c и file2.h, теперь переменная a доступна для функции fun () только в 1-м файле.

0 голосов
/ 11 августа 2011

Рекомендуется по возможности избегать использования глобальных переменных. В вашем конкретном случае вы можете просто:

function(int* toModify)
{
    *toModify = 10;
    // do sth
}

Теперь ваши другие функции могут использовать измененное значение.

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

int gIsFuncCalled = 0;
int gToModify = 0;

void function() 
{ 
    gIsFuncCalled = 1;
    gToModify = 10;
}

Теперь вы можете использовать gToModify условно, используя gIsFuncCalled

0 голосов
/ 11 августа 2011

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

т.е.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...