Должен ли я переопределить часть внешнего массива для использования в модуле - PullRequest
0 голосов
/ 02 ноября 2018

Допустим, у меня есть широкие переменные блоки проекта с внешней связью vByte[1000], vWord[1000] и vQword[1000]. А из-за отсутствия лучшего решения для отладки каждая переменная, которую я хочу видеть во время выполнения, должна быть в этих блоках.

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

Сначала я объявил бы массив extern vByte[1000]; в своем модуле, и я хотел бы дать определенной переменной массива подходящее имя.

Я мог бы просто #define переменные, которые я хочу использовать: #define importantValue1 vByte[21] и использовать их вот так.

Но я думаю, что было бы лучше инкапсулировать переменную в моем модуле, возможно, так:

static byte *importantValue1 = &vByte[21]; 

Это подтверждает, что эта переменная предназначена для использования в этом модуле. Есть ли у этого недостатки или это просто прямой подход с меньшими накладными расходами и без недостатков?

1 Ответ

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

Трудно ответить, является ли #define или указатель лучшим подходом в целом.

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

Так что я бы сказал, что вопрос не в том, лучше ли подход # define- или указатель; Я бы предпочел стремиться к функциям, которые не обращаются к этим глобальным массивам (независимо от того, какой метод «переменной»), а вместо этого используют только параметры / аргументы функции.

Кстати: обратите внимание, что #define - «переменная» и переменная-указатель должны использоваться по-разному, так как в первом случае вы можете написать importantValue1 = 10, тогда как во втором случае вам придется написать *importantValue1 = 10. Но я думаю, что вы знаете об этом.

...