реклама на сайте
подробности

 
 
> Вызов «xcat(xcat(1, 2), 3)» будет заменён на «123», не хватает мозга понять!
ViKo
сообщение Apr 7 2018, 19:41
Сообщение #1


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Что в книге Кернигана с Ричи, что на просторах интернет говорится о том что во вложенных макросах надо объединять строки в два этапа:
#define cat(x,y) x##y
#define xcat(x,y) cat(x,y)
и тогда уже будет нормально выполняться
xcat(xcat(1,2),3)
Как пройти по шагам, что при этом будет выполняться?
В Википедии бред какой-то наблюдаю. Также и во многих интернетных статьях.
https://ru.wikipedia.org/wiki/%D0%9F%D1%80%...80_%D0%A1%D0%B8
http://we.easyelectronics.ru/Soft/preprocessor-c.html
https://www.opennet.ru/docs/RUS/cpp/cpp-5.html
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Arlleex
сообщение May 4 2018, 07:50
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 492
Регистрация: 12-11-11
Пользователь №: 68 264



В общем это тема для меня пока что не совсем понятна.
Пытаюсь сделать следующее.
Есть функция
Код
GPIO_PinAFConfig(GPIOA, GPIO_PinSource0, GPIO_AF_SPI1);

Здесь GPIO_AF_SPI1 - это тоже некий #define.

И я хочу сделать следующее. В файле настроек иметь что-то наподобие
Цитата
#define LCD_SPI_MODULE SPI1

При этом ключевое слово SPI1 - это тоже макрос на начало области памяти модуля SPI1.

Хочу сделать так
Код
#define GPIO_AF_EXPAND_E(a, b) a##b
#define GPIO_AF_EXPAND(a, b) GPIO_AF_EXPAND_E(a, b)
GPIO_PinAFConfig(GPIOA, GPIO_PinSource0, GPIO_EXPAND(GPIO_AF_, LCD_SPI_MODULE));

Но один фиг не работает так как надо, не получаю я после разворачивания макроса GPIO_AF_SPI1 (пишет Error: L6218E: Undefined symbol GPIO_AF_ (referred from hardware.o).).

Это вообще реально? Логику макросов вообще тут понять сложно, с учетом того, что SPI1 и GPIO_AF_SPI1 - тоже макрос-объекты.

Сообщение отредактировал Arlleex - May 4 2018, 07:51
Go to the top of the page
 
+Quote Post
Baser
сообщение May 4 2018, 13:42
Сообщение #3


Просто Che
*****

Группа: Свой
Сообщений: 1 567
Регистрация: 22-05-07
Из: ExUSSR
Пользователь №: 27 881



Цитата(Arlleex @ May 4 2018, 10:50) *
Это вообще реально? Логику макросов вообще тут понять сложно, с учетом того, что SPI1 и GPIO_AF_SPI1 - тоже макрос-объекты.

Вы не привели законченного куска кода со всеми вложенными макросами, поэтому не совсем понятно почему вылезла именно ошибка Undefined symbol GPIO_AF_

На мой взгляд, если где-то есть описание типа:
#define SPI1 0x1234
#define LCD_SPI_MODULE SPI1
то должна быть ошибка
Undefined symbol GPIO_AF_0x1234

потому что каждый раз макросы разворачиваются до конца своей вложенности.
И можно ли на конкретном проходе макроподстановки ограничить разворачивание вложенности одним уровнем, это вопрос интересный...
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- ViKo   Вызов «xcat(xcat(1, 2), 3)» будет заменён на «123»   Apr 7 2018, 19:41
- - jcxz   Цитата(ViKo @ Apr 7 2018, 22:41) Как прой...   Apr 7 2018, 19:47
|- - ViKo   Цитата(jcxz @ Apr 7 2018, 22:47) В свойст...   Apr 7 2018, 19:52
|- - AHTOXA   Eclipse показывает 4 шага: Кодxcat(cat(1,...   Apr 7 2018, 20:01
- - ViKo   То есть, сначала в аргументе макрофункции произошл...   Apr 7 2018, 20:18
- - ViKo   Точнее, вопрос, почему в макрофункции cat(cat(1,2)...   Apr 8 2018, 05:19
|- - SSerge   Цитата(ViKo @ Apr 8 2018, 12:19) Точнее, ...   Apr 8 2018, 10:31
|- - AHTOXA   Цитата(ViKo @ Apr 8 2018, 10:19) Точнее, ...   Apr 8 2018, 10:33
- - ViKo   Ага, так в выражении: Если в замещающей последоват...   Apr 9 2018, 09:40
- - Baser   Если есть желание совсем "надломить моск...   Apr 9 2018, 09:54
- - ViKo   Спасибо, почитаем-с! Я, в принципе, пользуюсь ...   Apr 9 2018, 10:01
- - XVR   Можно проще - # и ## применяются ДО ТОГО, как прои...   Apr 9 2018, 11:02
- - Arlleex   Кодпотому что каждый раз макросы разворачиваются д...   May 4 2018, 16:36
|- - Baser   Цитата(Arlleex @ May 4 2018, 19:36) funct...   May 4 2018, 18:23
- - Arlleex   Ну да, получается, что так. Спасибо   May 4 2018, 18:25


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 14:08
Рейтинг@Mail.ru


Страница сгенерированна за 0.01378 секунд с 7
ELECTRONIX ©2004-2016