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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> Сложная автозамена через #define
jcxz
сообщение Dec 21 2015, 08:11
Сообщение #16


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(kolobochishe @ Dec 18 2015, 16:28) *
я это и хотел, но простая конкатенация с одним уровнем не работает. Компилятор сразу подставляет MY_TYMER вместо TIMER7

Для того и нужно два уровня, чтобы выполнялась подстановка значений заданных #define.
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Dec 23 2015, 00:30
Сообщение #17


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(kolobochishe @ Dec 18 2015, 13:28) *
Если они все расположены друг за другом (вроде других вариантов пока не встречал), то хороший метод

Я встречал, например у Freescale, но это очень просто решается - добавлением "резервных" полей, которые не используются.


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Apr 28 2016, 17:28
Сообщение #18


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



В продолжение темы.
В исходниках V-USB часто встречаются макросы (дефайны) с одинаковыми именами/идентификаторами на входе и на выходе макроса. Как компиляторы относятся к этому и что говорит стандарт?

Если компилятору "случайно" второй раз применить этот макрос к результату этого же макроса, то получится билиберда.

Сообщение отредактировал GetSmart - Apr 28 2016, 18:03


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
AleksBak
сообщение Apr 29 2016, 03:17
Сообщение #19


Частый гость
**

Группа: Участник
Сообщений: 132
Регистрация: 6-02-16
Из: г. Баку
Пользователь №: 90 364



Цитата(GetSmart @ Apr 28 2016, 21:28) *
В продолжение темы.
В исходниках V-USB часто встречаются макросы (дефайны) с одинаковыми именами/идентификаторами на входе и на выходе макроса. Как компиляторы относятся к этому и что говорит стандарт?

Если компилятору "случайно" второй раз применить этот макрос к результату этого же макроса, то получится билиберда.

Такие макросы сделаны для "удобства", но главное для улучшения читаемости кода. А применять в итоге их следует с осторожностью. Склейка и вложенные макросы могут по-разному работать у разных компиляторов т.к. не совсем стандартны.
Go to the top of the page
 
+Quote Post
k155la3
сообщение Apr 29 2016, 05:48
Сообщение #20


Профессионал
*****

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



Если возникает сомнение в том
- как использовать макроподстановку
- как ОНО будет работать
следует подумать "а не подправить ли что в консерватории"

Для начала следовало бы (IMHO) убрать "повторы", например, то
что подлежит обработке через макрос переименовать в уникальное для данного проекта значение
например TIMER в TiMeR. Это вручную, внимательно - радактором по всему проекту
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Apr 29 2016, 06:23
Сообщение #21


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (AleksBak @ Apr 29 2016, 06:17) *
т.к. не совсем стандартны.
Про это можно подробнее? В Стандарте есть раздел 6.10.3.1 Argument substitution.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
AleksBak
сообщение Apr 29 2016, 06:55
Сообщение #22


Частый гость
**

Группа: Участник
Сообщений: 132
Регистрация: 6-02-16
Из: г. Баку
Пользователь №: 90 364



Цитата(Сергей Борщ @ Apr 29 2016, 10:23) *
Про это можно подробнее? В стандарте есть раздел 6.10.3.1 Argument substitution.

В смысле не все компиляторы могут поддержать. Это имел ввиду.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Apr 29 2016, 08:08
Сообщение #23


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (AleksBak @ Apr 29 2016, 09:55) *
В смысле не все компиляторы могут поддержать. Это имел ввиду.
Если компилятор не выполняет требования Стандарта, то это компилятор "языка, похожего на Си", но никак не компилятор Си. Использовать такой компилятор просто не нужно и уж тем более нет смысла писать код с оглядкой на такие компиляторы.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
ViKo
сообщение Apr 29 2016, 08:15
Сообщение #24


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

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



Про особенности #define еще Керниган с Ричи в своей книжке писали. Есть смысл ознакомиться. А компиляторы не при чем, они работают, как надо.
Go to the top of the page
 
+Quote Post
GetSmart
сообщение May 3 2016, 16:39
Сообщение #25


.
******

Группа: Участник
Сообщений: 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


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
SSerge
сообщение May 4 2016, 16:33
Сообщение #26


Профессионал
*****

Группа: Свой
Сообщений: 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.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 24th June 2025 - 03:06
Рейтинг@Mail.ru


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