Перейти к содержанию
    

Макро определения глобальных переменных в нескольких файлах

Имею макро, как описано на сайте 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

Как? Как сделать, чтоб работало? У меня - никакие фокусы не проходят.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

__attribute__((bitband))

Как думаете, в этом макросе двойные скобочки просто так стоят?

Надо же, я и сам только сейчас понял.

Вот ведь...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как думаете, в этом макросе двойные скобочки просто так стоят?

И про эти двойные - не знаю зачем. Подскажите.

И на мои двойные ругается.

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});

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А зачем такие извращения?

Нельзя просто по-человечески объявить

LCDMode_t LCDMode = {1, 3, 0};

А, понял...

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А зачем такие извращения?

Чтобы не определялось снова в других файлах.

Только в одном инициализируется, а в остальных вместо INIT пустота (см. первое макро).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Короче, в одном месте у вас запятые распознаются как разделители параметров макроса, и их, естественно получается многовато.

В другом - не хочет есть фигурные скобки внутри круглых.

 

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

 

#define LCD_MODE_INIT_VALUES {1,2,3}

DECL LCDMode_t LCDMode INIT(LCD_MODE_INIT_VALUES);

 

Но не уверен, что прокатит

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

#define  INIT(x) = x

нехорошо так макросы писать.

 

По человечески будет в коде смотреться так:

#define  INIT(x) x

 

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

 

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

 

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

в заголовочном файле:

typedef struct
{
    ...
    ...
} my_struct_t;

extern my_struct_t x;

в файле реализации:

my_struct_t x = 
{
    ...
    ...
};

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Получилось!

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

 

нехорошо так макросы писать.

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

Так советует Keil.

иначе как бы я запретил инициализацию в ненужном файле?

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

Решение MrYuran меня устраивает на все 100%.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Так советует Keil.
На заборе тоже много дельных советов встречается:-)

иначе как бы я запретил инициализацию в ненужном файле?
Как я привёл в примере.

Не нужно в заголовочные файлы совать определение переменных...

Не стоит бежать впереди паровоза:-)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Во - ссылку нашел.

http://www.keil.com/support/docs/1868.htm

 

Не нужно в заголовочные файлы совать определение переменных...

Они у меня глобальные.

На этот счет тоже можно поспорить. Но не буду. Я выбрал свой путь.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...