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

 
 
> Вызов «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
Ответов
ViKo
сообщение Apr 8 2018, 05:19
Сообщение #2


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

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



Точнее, вопрос, почему в макрофункции
cat(cat(1,2),3)
не складываются так
cat(12,3)
123
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Apr 8 2018, 10:33
Сообщение #3


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(ViKo @ Apr 8 2018, 10:19) *
Точнее, вопрос, почему в макрофункции
cat(cat(1,2),3)
не складываются так
cat(12,3)
123

Вот объяснение (отсюда):

Цитата
3.10.6 Argument Prescan

Цитата
Macro arguments are completely macro-expanded before they are substituted into a macro body, unless they are stringified or pasted with other tokens. After substitution, the entire macro body, including the substituted arguments, is scanned again for macros to be expanded. The result is that the arguments are scanned twice to expand macro calls in them.


При раскрытии xcat(xcat(1, 2), 3) сначала, как полагается, производится прескан аргументов. Раскрывается первый аргумент:
xcat(1, 2) -> cat(1, 2) -> 12.
Прескан второго аргумента дает результат 3.

Теперь раскрывается сам макрос:
xcat(12, 3) -> cat(12, 3) -> 123.


Ключевая фраза "unless they are stringified".


--------------------
Если бы я знал, что такое электричество...
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
|- - SSerge   Цитата(ViKo @ Apr 8 2018, 12:19) Точнее, ...   Apr 8 2018, 10:31
- - 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, 07:50
|- - Baser   Цитата(Arlleex @ May 4 2018, 10:50) Это в...   May 4 2018, 13:42
- - 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 Текстовая версия Сейчас: 28th July 2025 - 15:12
Рейтинг@Mail.ru


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