Каковы плюсы и минусы использования внешних переменных в C в производственном коде? - PullRequest
0 голосов
/ 11 июля 2019

У меня есть переменная, которой я должен поделиться в нескольких файлах. Таким образом, одним из способов доступа к этой переменной в функциях, определенных в других файлах, является передача ее в аргументах вызовов функций. Другой способ - использование extern. Extern переменные будут работать. Но я не уверен, с какими основными проблемами мне придется столкнуться ..

Ответы [ 2 ]

4 голосов
/ 11 июля 2019

Можно разделить переменную между файлами (как минимум) четырьмя способами. Вы уже упомянули два из них:

  • с использованием extern: это будет глобальная переменная, любой сможет ее изменить, не поточно-ориентированный; использование глобальных переменных должно быть сведено к минимуму;
  • передача указателя на переменную: он предоставит доступ для чтения / записи к переменной;
  • передача значения переменной: обеспечивает доступ к переменной только для чтения;
  • с использованием функции доступа.

Функция может быть простой:

float read_speed()
{
    return speed;
}

Если переменную также нужно изменить, можно предоставить другую функцию:

void write_speed(float new_speed)
{
    speed = new_speed;
}

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

Стоимость кода немного увеличится, а скорость немного снизится.

Сравните:

float read_speed_mph(); // get speed in miles per hour
float read_speed_mps(); // get speed in meters per second

Они оба возвращают одинаковую скорость, выраженную в разных единицах. Тело функций выполнит правильное вычисление, чтобы обеспечить правильное значение, в то время как переменная останется неизменной.

0 голосов
/ 11 июля 2019

В дополнение / в качестве конкретного примера к тому, что написал virolino:

Комбинация внешних переменных плюс функции получения и установки («функции доступа») обычно используется для уровней интерфейса:

  • объявить переменную в заголовочном файле как extern, например:
    extern uint8_t var;

  • определить переменную в исходном файле:
    uint8_t var= 5;

  • реализовать метод получения / установки в заголовке, например:
    static inline uint8_t Get_Var(void) { return var; }

Но, как уже было сказано, вы можете напрямую манипулировать var.

...