На языке C я хочу получить доступ к глобальной статической переменной вне объема файла. Сообщите мне самый лучший способ сделать это. Один из методов должен присвоить глобальной переменной экстерна значение статической переменной,
В файле a.c
static int val = 10;
globalvar = val;
В файле b.c
extern globalvar;
Но в этом случае любые изменения в val (файл a.c) не будут обновлены в globalvar в (файл b.c).
Сообщите мне, как я могу достигнуть того же.
Спасибо, Sikandar.
Ну, если вы можете модифицировать файл a.c
, то просто сделайте val
нестатической. Если вы можете модифицировать a.c.
, но не можете сделать val
нестатическим (почему?), то вы можете просто объявить глобальный указатель на него в a.c.
int *pval = &val;
и в b.c.
do
extern int *pval;
, что позволит вам получить доступ к текущему значению val
через *pval
. Или же Вы можете ввести нестатическую функцию, которая вернет текущее значение val
.
Но опять же, если Вам нужно получить доступ к ней из других модулей перевода, просто сделайте ее нестатической.
.Решение 1:
В файле a.c
static int val=10;
int *globalvar =&val;
В файле b.c
extern int *globalvar;
Решение 2:
Вместо того, чтобы иметь другую переменную для передачи адреса статической переменной, добавляющую несколько потерь памяти, сделайте саму статическую переменную extern.
Решение 2 рекомендуется, но в случае, если вы ограничены изменением статической переменной на extern, используйте решение 1.
.Вы не можете получить доступ к статической переменной файлового уровня вне файла.
Если вам действительно нужно это сделать, у вас есть пара вариантов.
Добавьте функцию доступа к файлу, в котором есть статическая переменная. Хорошо, что это ограничивает доступ извне файла для доступа только на чтение:
int read_static() { return val; }
Бросьте статический квалификатор и сделайте переменную глобальной.
Можно сделать указатель на глобальную статическую переменную.
/* file a.c */
static int a = 100; /* global static variable not visible outside this file.*/
int *b = &a; /* global int pointer, pointing to global static*/
/* file b.c */
extern int *b; /* only declaration, b is defined in other file.*/
int main()
{
printf("%d\n",*b); /* dereferencing b will give the value of variable a in file a.c */
return 0;
}
При запуске:
$ gcc *.c && ./a.out
100