Доступ к значению глобальной переменной в разных файлах .c, находящихся по разным путям - PullRequest
1 голос
/ 21 июня 2019

У меня есть 2 файла: Sod/iload/iload.c и Item/itemrule/itemrule.c, и я хочу получить доступ к переменной, определенной в iload.c, которая определена в itemrule.c.

Для этого я создал и определил глобальную переменную в iload.c и попытался получить доступ к этой переменной в itemrule .c с помощью ключевого слова extern, но оно всегда равно 0.

Я беспокоюсь, что это может быть из-за того, что файлы имеют разные пути, кто-нибудь знает, как я могу получить доступ к этой переменной?

Ответы [ 2 ]

2 голосов
/ 21 июня 2019

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

// foo.h
// Make the global visible in any C file that includes this header.
extern int my_global_var;
// foo.c
#include "foo.h" // Not really needed here, but fine.
int my_global_var;
...
// bar.c
#include <stdio.h>
#include "foo.h" // This one makes the global visible in the rest of the file.

void do_something(void) {
  printf("my global var's value is: %d\n", my_global_var);
}

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

0 голосов
/ 21 июня 2019

Я хотел бы предложить альтернативу ответу Джина. По моему опыту, есть два основных способа совместного использования переменных между модулями (единицы компиляции):

1) «Геттеры и сеттеры».

2) Экстерны.

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

1) Геттеры и сеттеры:

// foo.c
#include <stdio.h>
int my_global_var = 0;
...

Тогда вы можете следить за этим с помощью внешних и получающих методов установки. i.e.:

int get_my_global_var(void)
{
  return my_global_var;
}

void set_my_global_var(int var)
{
  my_global_var = var;
}

Это делается в файле c (модуле). Это будут получатели и установщики смогут вызываться из любого другого модуля, и они получат и установят глобальную переменную my_global_var.

2) Экстерьеры:

// foo.c
#include <stdio.h>
int my_global_var = 0;
...

Альтернативой геттерам и сеттерам является использование внешних. В этом случае вы ничего не добавляете к модулю, который содержит глобальную переменную, к которой вы хотите получить доступ / изменить (my_global_var).

// bar.c
#include <stdio.h>
extern int my_global_var;
...

Обратите внимание на синтаксис здесь; когда мы используем ключевое слово extern , мы не инициализируем его как что-либо. Мы просто выводим компилятору, что глобальная переменная my_global_var имеет внешнюю связь.

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