ViKo 1 10 ноября, 2010 Опубликовано 10 ноября, 2010 · Жалоба Имею макро, как описано на сайте 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 27 10 ноября, 2010 Опубликовано 10 ноября, 2010 · Жалоба __attribute__((bitband)) Как думаете, в этом макросе двойные скобочки просто так стоят? Надо же, я и сам только сейчас понял. Вот ведь... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 10 ноября, 2010 Опубликовано 10 ноября, 2010 · Жалоба Как думаете, в этом макросе двойные скобочки просто так стоят? И про эти двойные - не знаю зачем. Подскажите. И на мои двойные ругается. 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 27 10 ноября, 2010 Опубликовано 10 ноября, 2010 · Жалоба А зачем такие извращения? Нельзя просто по-человечески объявить LCDMode_t LCDMode = {1, 3, 0}; А, понял... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 10 ноября, 2010 Опубликовано 10 ноября, 2010 · Жалоба А зачем такие извращения? Чтобы не определялось снова в других файлах. Только в одном инициализируется, а в остальных вместо INIT пустота (см. первое макро). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrYuran 27 10 ноября, 2010 Опубликовано 10 ноября, 2010 · Жалоба Короче, в одном месте у вас запятые распознаются как разделители параметров макроса, и их, естественно получается многовато. В другом - не хочет есть фигурные скобки внутри круглых. Надо как-то так: #define LCD_MODE_INIT_VALUES {1,2,3} DECL LCDMode_t LCDMode INIT(LCD_MODE_INIT_VALUES); Но не уверен, что прокатит Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg_spb 0 10 ноября, 2010 Опубликовано 10 ноября, 2010 · Жалоба #define INIT(x) = x нехорошо так макросы писать. По человечески будет в коде смотреться так: #define INIT(x) x Такое присвоение нет смысла прятать в макросе - моветон... Вы ерундой занимаетесь. Если не хотите кучу дублирующегося кода лицезреть то привыкайте к структурам. в заголовочном файле: typedef struct { ... ... } my_struct_t; extern my_struct_t x; в файле реализации: my_struct_t x = { ... ... }; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 10 ноября, 2010 Опубликовано 10 ноября, 2010 · Жалоба Надо как-то так: Получилось! Забыл поблагодарить! Спасибо!! нехорошо так макросы писать. Такое присвоение нет смысла прятать в макросе - моветон... Так советует Keil. иначе как бы я запретил инициализацию в ненужном файле? В ответ на ваше дополнение - то, что вы предложили, делается у меня автоматически, благодаря макросу. Причем сразу во всех файлах проекта. И вам советую. Решение MrYuran меня устраивает на все 100%. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg_spb 0 10 ноября, 2010 Опубликовано 10 ноября, 2010 · Жалоба Так советует Keil.На заборе тоже много дельных советов встречается:-) иначе как бы я запретил инициализацию в ненужном файле?Как я привёл в примере. Не нужно в заголовочные файлы совать определение переменных... Не стоит бежать впереди паровоза:-) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 10 ноября, 2010 Опубликовано 10 ноября, 2010 · Жалоба Во - ссылку нашел. http://www.keil.com/support/docs/1868.htm Не нужно в заголовочные файлы совать определение переменных... Они у меня глобальные. На этот счет тоже можно поспорить. Но не буду. Я выбрал свой путь. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться