Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Макро определения глобальных переменных в нескольких файлах
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > Keil
ViKo
Имею макро, как описано на сайте Keil (только без подчеркиваний)
Код
#ifndef  VAR_DECLS
  #define  DECL extern
  #define  INIT(x)
#else
  #define  DECL
  #define  INIT(x) = x
#endif

В одном из файлов (Main.c), задаю VAR_DECLS, там эти переменные определяются и инициализируются. В остальных - только объявляются. Классика.
Имею тип структуры, и пытаюсь ее определить
Код
typedef struct {  
  int WorkAreaWide : 1;  // Work Area Wide
  int WorkScaleForm : 2; // Work Scale Form
  int dummy  : 6;
  } LCDMode_t  __attribute__((bitband));
DECL LCDMode_t LCDMode INIT({1, 3, 0});

На последнюю строку компилятор ругается
error: #55: too many arguments in macro invocation
Как? Как сделать, чтоб работало? У меня - никакие фокусы не проходят.

MrYuran
Цитата
__attribute__((bitband))

Как думаете, в этом макросе двойные скобочки просто так стоят?
Надо же, я и сам только сейчас понял.
Вот ведь...
ViKo
Цитата(MrYuran @ Nov 10 2010, 12:36) *
Как думаете, в этом макросе двойные скобочки просто так стоят?

И про эти двойные - не знаю зачем. Подскажите.
И на мои двойные ругается.
DECL LCDMode_t LCDMode INIT(({1, 3, 0}));
warning: #520-D: initialization with "{...}" expected for aggregate object
error: #29: expected an expression
Я ж говорю, перепробовал всякое.

Вот так работает. Только это ж не то.
DECL LCDMode_t LCDMode INIT({0});
MrYuran
А зачем такие извращения?
Нельзя просто по-человечески объявить
LCDMode_t LCDMode = {1, 3, 0};
А, понял...
ViKo
Цитата(MrYuran @ Nov 10 2010, 14:11) *
А зачем такие извращения?

Чтобы не определялось снова в других файлах.
Только в одном инициализируется, а в остальных вместо INIT пустота (см. первое макро).
MrYuran
Короче, в одном месте у вас запятые распознаются как разделители параметров макроса, и их, естественно получается многовато.
В другом - не хочет есть фигурные скобки внутри круглых.

Надо как-то так:

#define LCD_MODE_INIT_VALUES {1,2,3}
DECL LCDMode_t LCDMode INIT(LCD_MODE_INIT_VALUES);

Но не уверен, что прокатит
demiurg_spb
Цитата(ViKo @ Nov 10 2010, 13:25) *
Код
#define  INIT(x) = x
нехорошо так макросы писать.

По человечески будет в коде смотреться так:
Код
#define  INIT(x) x


Такое присвоение нет смысла прятать в макросе - моветон...

Вы ерундой занимаетесь.

Если не хотите кучу дублирующегося кода лицезреть то привыкайте к структурам.
в заголовочном файле:
Код
typedef struct
{
    ...
    ...
} my_struct_t;

extern my_struct_t x;

в файле реализации:
Код
my_struct_t x =
{
    ...
    ...
};
ViKo
Цитата(MrYuran @ Nov 10 2010, 14:17) *
Надо как-то так:

Получилось!
Забыл поблагодарить! Спасибо!!

Цитата(demiurg_spb @ Nov 10 2010, 14:22) *
нехорошо так макросы писать.
Такое присвоение нет смысла прятать в макросе - моветон...

Так советует Keil.
иначе как бы я запретил инициализацию в ненужном файле?
В ответ на ваше дополнение - то, что вы предложили, делается у меня автоматически, благодаря макросу. Причем сразу во всех файлах проекта. И вам советую.
Решение MrYuran меня устраивает на все 100%.
demiurg_spb
Цитата(ViKo @ Nov 10 2010, 15:27) *
Так советует Keil.
На заборе тоже много дельных советов встречается:-)
Цитата
иначе как бы я запретил инициализацию в ненужном файле?
Как я привёл в примере.
Не нужно в заголовочные файлы совать определение переменных...
Не стоит бежать впереди паровоза:-)
ViKo
Во - ссылку нашел.
http://www.keil.com/support/docs/1868.htm

Цитата(demiurg_spb @ Nov 10 2010, 14:33) *
Не нужно в заголовочные файлы совать определение переменных...

Они у меня глобальные.
На этот счет тоже можно поспорить. Но не буду. Я выбрал свой путь.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.