Jump to content

    

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

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

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

 

 

Share this post


Link to post
Share on other sites
__attribute__((bitband))

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

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

Вот ведь...

Share this post


Link to post
Share on other sites
Как думаете, в этом макросе двойные скобочки просто так стоят?

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

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

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

Share this post


Link to post
Share on other sites

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

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

LCDMode_t LCDMode = {1, 3, 0};

А, понял...

 

Share this post


Link to post
Share on other sites
А зачем такие извращения?

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

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

Share this post


Link to post
Share on other sites

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

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

 

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

 

#define LCD_MODE_INIT_VALUES {1,2,3}

DECL LCDMode_t LCDMode INIT(LCD_MODE_INIT_VALUES);

 

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

Share this post


Link to post
Share on other sites
#define  INIT(x) = x

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

 

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

#define  INIT(x) x

 

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

 

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

 

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

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

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

extern my_struct_t x;

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

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

Share this post


Link to post
Share on other sites
Надо как-то так:

Получилось!

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

 

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

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

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

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

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

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

Share this post


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

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

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

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

Share this post


Link to post
Share on other sites

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

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

 

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

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

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this