|
Сложная автозамена через #define |
|
|
|
Apr 29 2016, 03:17
|
Частый гость
 
Группа: Участник
Сообщений: 132
Регистрация: 6-02-16
Из: г. Баку
Пользователь №: 90 364

|
Цитата(GetSmart @ Apr 28 2016, 21:28)  В продолжение темы. В исходниках V-USB часто встречаются макросы (дефайны) с одинаковыми именами/идентификаторами на входе и на выходе макроса. Как компиляторы относятся к этому и что говорит стандарт?
Если компилятору "случайно" второй раз применить этот макрос к результату этого же макроса, то получится билиберда. Такие макросы сделаны для "удобства", но главное для улучшения читаемости кода. А применять в итоге их следует с осторожностью. Склейка и вложенные макросы могут по-разному работать у разных компиляторов т.к. не совсем стандартны.
|
|
|
|
|
Apr 29 2016, 06:55
|
Частый гость
 
Группа: Участник
Сообщений: 132
Регистрация: 6-02-16
Из: г. Баку
Пользователь №: 90 364

|
Цитата(Сергей Борщ @ Apr 29 2016, 10:23)  Про это можно подробнее? В стандарте есть раздел 6.10.3.1 Argument substitution. В смысле не все компиляторы могут поддержать. Это имел ввиду.
|
|
|
|
|
May 3 2016, 16:39
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Цитата The argument list is enclosed in parentheses and must immediately follow the macro name. Вопрос о допустимости применения macro name в теле того же макроса. Argument substitution, если дословно, то из другой оперы. Очень может быть, что macro name в своём же теле таит какую-то граблю. К тому же, макросы можно переобъявлять. Но пока ещё глубоко не копался. Язык похожий на Си - забавно. Как права, похожие на права человека. По-американски.
Сообщение отредактировал GetSmart - May 3 2016, 18:01
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
May 4 2016, 16:33
|
Профессионал
    
Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528

|
Цитата(GetSmart @ May 3 2016, 23:39)  Вопрос о допустимости применения macro name в теле того же макроса. Argument substitution, если дословно, то из другой оперы. Очень может быть, что macro name в своём же теле таит какую-то граблю. К тому же, макросы можно переобъявлять. Но пока ещё глубоко не копался. А это раздел 6.10.3.4 Rescanning and further replacement. В общем, рекурсия в макроопределениях не допускается, но как именно она не допускается - это место в С довольно тёмное, пример в том разделе отлично сносит крышу.
--------------------
Russia est omnis divisa in partes octo.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|