Как получить доступ к статической переменной в другом файле без использования extern в .h?

avatar
A.BHi
9 августа 2021 в 02:03
194
1
1

Допустим, в файле first.c есть статическая переменная static uint8 Data_updated_u8, и в какой-то циклической функции ее значение обновляется. Теперь я хочу получить обновленное значение Data_updated_u8 в файле second.c. Есть ли способ получить статическую переменную в second.c без использования внешней переменной? Или с помощью указателей?

Источник
kaylum
9 августа 2021 в 02:09
0

Да, напишите API доступа/получения в первом файле.

Roflcopter4
9 августа 2021 в 02:49
0

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

Ответы (1)

avatar
Lundin
9 августа 2021 в 08:12
4

Теперь я хочу получить обновленное значение Data_updated_u8 в файле second.c

Это проблема дизайна. Если у вас есть локальная переменная static, объявленная в области файла в файле .c, то эта переменная должна рассматриваться как частная. Если ваш проект надежен, другие файлы не должны требовать прямого доступа к этой переменной. Так что здесь вы должны сделать шаг назад и обдумать дизайн своей программы в первую очередь.

Или с помощью указателей?

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

Если ​​вам действительно нужно использовать эту переменную совместно с другими файлами, то правильным способом будет написать API-функцию установки/получения, которую вы предоставляете через файл заголовка. Затем установите/получите данные по значению. (Возможно, вам даже не нужно устанавливать его извне?)

Кроме того, не стоит придумывать какой-то местный гаражный стандарт uint8. Используйте международный стандарт языка C uint8_t из stdint.h.

data.h

#include <stdint.h>

uint8_t get_data (void);

void set_data (uint8_t val);

data.c

#include "data.h"

static uint8_t data;

uint8_t get_data (void) { return data; }

void set_data (uint8_t val) { data = val; }