Доступ статической переменной из одного файла в другой файл
Недавно я столкнулся с вопросом, например, как получить доступ к переменной, объявленной как статическая в 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
Если я сделаю выше, я могу получить доступ к переменной.
Итак, мои вопросы:
Нарушает ли вышеуказанная программа правила статических переменных?
Если нет, то почему это так, и есть ли другой способ получить доступ к статической переменной, кроме файла (
#include <…>
) не так.Как я могу получить доступ к статической переменной из другого файла?
В C, как я могу ограничить область действия глобальной переменной файлом, в котором она объявлена?
Поправьте меня, если я ошибаюсь с концепцией статической переменной и есть ли более эффективные решения для доступа к статической переменной?
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;
}
Поправьте меня, если я ошибаюсь с концепцией статической переменной и есть ли более эффективные решения?
Статическая переменная имеет время жизни, которое распространяется на весь прогон программы
Если вы не инициализируете статическую переменную каким-либо значением, тогда ее значением по умолчанию будет 0.
Статическая переменная имеет область действия, ограниченную только ее файлом. Вы не можете получить к нему доступ по имени из другого файла.
У вас есть 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 для указателя.
Но это не обязательно делать.