Встроенный C. Сделать структуру extern против передачи ее по ссылке на другой источник - PullRequest
0 голосов
/ 25 октября 2018

Не особенно опытный в C, случайно сделал ответственность за небольшой проект микроконтроллера.

Итак, у меня есть структура, которая находится на file1.c.Используется несколькими функциями в этом файле.Он был определен как статическая изменчивая структура Structure прямо сейчас.

Структура объявлена ​​статической, потому что я прочитал в книге под названием «Справочник по кодированию при разработке встроенных систем», что «переменные, к которым обращаются несколько функций, определенных в одном и том же файле, должныбыть объявлено со статическим в области видимости файла ".Ну, он используется несколькими функциями, и я хочу, чтобы он основывался на файлах, поэтому я подумал, что он соответствует этому описанию.Волатильно, потому что он поддерживает некоторые операции чтения AD из некоторых портов.

У меня также есть файл file2.c, которому требуется доступ к значениям той же структуры.

Насколько я понимаю, у меня есть следующие варианты:

  1. в file1.h, определить эту структуру как extern, получить доступ к #include file1.h в file2.c и получить к ней доступ.Насколько я понимаю, это сделает структуру видимой для всего file2.c, хотя она понадобится только 1 функции
  2. , чтобы сохранить структуру как есть, и сделать функцию в file.2, которая принимаетструктурируйте по ссылочной функции (Structure * struct), сделайте эту функцию доступной из file1.c и просто передайте значение по ref-функции (& struct)

Какой подход является лучшим?Я знаю, что они оба работают, но есть ли конкретная причина, по которой я должен использовать одну, а не другую и т. Д.?

Я хочу уточнить, что структура typedef {variable} находится в другом заголовочном файле, которыйвключается как в file1.c, так и в file и file2.c, поэтому нет сомнений, что файлы распознают структуру.Я спрашиваю, какой лучший способ получить доступ к этой структуре, откуда это необходимо.

Ответы [ 3 ]

0 голосов
/ 26 октября 2018

На основании ваших разъяснений, struct, вероятно, не должен быть volatile квалифицированным.То, что фактические аппаратные регистры АЦП равны volatile, не означает, что данные, считываемые с них, должны быть.За исключением случаев, когда вы заполняете структуру из ISR или из DMA, но это не так (?).

Правильный дизайн - поместить typedef структуры в заголовокфайл и определение переменной в файле .c.Затем предоставьте доступ к переменной через функции получения / установки.Однако, подумайте, действительно ли другому коду нужен доступ к структуре как есть, или им просто нужно несколько значений из нее.В целом, используйте частную инкапсуляцию и держитесь подальше от extern.

0 голосов
/ 12 ноября 2018

Файл file2.c должен включать заголовок, который содержит typedef структуры.Файл file1.c должен определить функции доступа к структуре, которые могут быть или не быть теми же функциями, которые он использует для доступа к структуре.Здесь вы решаете, что такое «публичный», а что «частный».

0 голосов
/ 25 октября 2018

Вам нужно переместить определение структуры в заголовочный файл, иначе file2.c не распознает структуру, даже если вы передадите ее по ссылке.Ссылка или указатель все еще нуждаются в определении класса / структуры для компиляции ...

...