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

StackOverflow https://stackoverflow.com/questions/1973162

  •  21-09-2019
  •  | 
  •  

Вопрос

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

В файле AC

static int val = 10;
globalvar = val;

В файле до н.э.

extern globalvar;

Но в этом случае любые изменения в Val (файл AC) не будут обновляться в GlobalVar в (файл BC).

Пожалуйста, дайте мне знать, как я могу достичь того же.

Спасибо, Сикандар.

Это было полезно?

Решение

Ну, если вы можете изменить файл a.c Тогда просто сделай val нестатический.

Если вы можете изменить a.c но не могу сделать val Нестатический (почему?), Тогда вы можете просто объявить о глобальном указателе на него в a.c

int *pval = &val;

И в b.c делать

extern int *pval;

который позволит вам получить доступ к текущему значению val через *pval. Анкет Или вы можете представить нестатическую функцию, которая вернет текущее значение 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

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

Если вам действительно нужно это сделать, у вас есть пара вариантов.

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

    int read_static () {return val; }

  2. Отбросьте статический квалификатор и сделайте переменную глобальной.

Решение 1:

В файле AC

static int val=10;
int *globalvar =&val;

В файле до н.э.

extern int *globalvar;

Решение 2:

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top