Доступ статической переменной из одного файла в другой файл

Недавно я столкнулся с вопросом, например, как получить доступ к переменной, объявленной как статическая в file1.c, к другому file2.c?

Можно ли получить доступ к статической переменной?

Мое понимание статического ключевого слова в C:

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

Как один из моих друзей, предложите мне решение ниже.

В file1.c

   #include <stdio.h>

   int main()
   {
          int b=foo();
          printf("%d",b);
          return 0;
   }

в file2.c

   static int a=25;

   int foo()
   {
        return a;
   }

составленный gcc file1.c file2.c -o file

Если я сделаю выше, я могу получить доступ к переменной.

Итак, мои вопросы:

  1. Нарушает ли вышеуказанная программа правила статических переменных?

  2. Если нет, то почему это так, и есть ли другой способ получить доступ к статической переменной, кроме файла (#include <…>) не так.

    Как я могу получить доступ к статической переменной из другого файла?

    В C, как я могу ограничить область действия глобальной переменной файлом, в котором она объявлена?

  3. Поправьте меня, если я ошибаюсь с концепцией статической переменной и есть ли более эффективные решения для доступа к статической переменной?

4 ответа

Решение

1) нарушает ли вышеуказанная программа правила статических переменных?

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

2) Если нет, то почему это так, и есть ли другой способ получить доступ к статической переменной, кроме файла (#include<>), кроме этого. Как я могу получить доступ к статической переменной из другого файла?

Статические переменные предназначены только для использования в этом файле.

Вы не можете использовать эту переменную, делая их внешними в других файлах.

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

file1.c

 #include<stdio.h>
  static int a=25;
  int* ptr = &a;

file2.c

#include<stdio.h>
extern int *ptr;

   int main()
   {
          printf("%d",*ptr);
          return 0;
   }

Поправьте меня, если я ошибаюсь с концепцией статической переменной и есть ли более эффективные решения?

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

  2. Если вы не инициализируете статическую переменную каким-либо значением, тогда ее значением по умолчанию будет 0.

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

  4. У вас есть temp1.c и temp2.c, которые скомпилированы вместе, а также вы можете иметь статические переменные с одинаковыми именами в обоих файлах - и они являются отдельными переменными.

В C, как я могу ограничить область действия глобальной переменной файлом, в котором она объявлена?

Делая эту глобальную переменную статической.

То, что мы обычно называем переменной в C, на самом деле две вещи: объект, память, выделенная для переменной, интерпретируемой с определенным типом, и идентификатор, один из способов доступа к этому объекту.

Там нет проблем в доступе к static объект или его значение из другого модуля компиляции. Ваша функция foo продвигает значение в другую единицу, это нормально, но это может даже продвигать адрес a без проблем.

Наличие внутренней связи касается только идентификатора, имени a, Этот виден только внутри file2.c,

С static int a=25; переменная a будет иметь внутреннюю связь; это означает, что компоновщик не может видеть a где-нибудь за пределами file2.c Ту

Когда ты звонишь foo() в file2.cВы получаете копию aэто копия, которую вы печатаете; но это не значит, что у вас есть доступ к фактическому a определяется в file2.c Когда вам нужен такой доступ, когда одна и та же переменная видна в разных TU, вы можете сделать это

Определение файла

Этот файл объявляет и определяет переменную; дополнительно также инициализирует его 1, без которого по умолчанию оно будет инициализировано 0.

// (non-static) global variable with external linkage and thus visible across TUs
int var_across = 0;
void use()
{
   var_across = 1;
}

Используя файл

// just a declaration to tell that it's defined elsewhere; not a definition
extern int var_across;
void use_here()
{
   var_across = 2;
}

Присвоение адреса статической переменной указателю сделает статическую переменную доступной для подфайлов.

В подфайлах мы должны использовать ключевое слово extern для указателя.

Но это не обязательно делать.

Другие вопросы по тегам