|
#define, вопросы по подстановке |
|
|
|
 |
Ответов
|
Jun 29 2015, 14:24
|
Профессионал
    
Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528

|
Цитата(Метценгерштейн @ Jun 29 2015, 20:43)  может ли препроцессор заглянуть вниз и увидеть, что NUM ниже есть у него? По описанию- не должен, но реально Keil проглатывает это. Препроцессору не нужно никуда заглядывать, для него директива #define SUMM (NUM+8) значит следующее: запомнить что если в разбираемом тексте попадётся лексема SUMM, то заменить её на текст (NUM+8). При этом препроцессору не нужно знать что из себя представляет этот NUM, для него это просто три буквы. Только и всего. Аналогично и со вторым макроопределением. А вот когда ниже в тексте программы попадается имя макроопределения, то производится макроподстановка, после чего получившийся текст снова разбирается от начала макроподстановки и к этому тексту снова будут применяться имеющиеся на данный момент макроопределения, за исключением уже применённых (во избежание рекурсии). Хотя вот это место даже в стандарте описано так, что ничего непонятно. Порядок появления макроопределений в данном случае не важен, главное чтобы они оба уже встретились до того как понадобится их применение.
--------------------
Russia est omnis divisa in partes octo.
|
|
|
|
|
Jun 29 2015, 14:33
|
Профессионал
    
Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079

|
Цитата(SSerge @ Jun 29 2015, 17:24)  Препроцессору не нужно никуда заглядывать, для него директива #define SUMM (NUM+8) значит следующее: запомнить что если в разбираемом тексте попадётся лексема SUMM, то заменить её на текст (NUM+8). При этом препроцессору не нужно знать что из себя представляет этот NUM, для него это просто три буквы. Только и всего. Аналогично и со вторым макроопределением.
А вот когда ниже в тексте программы попадается имя макроопределения, то производится макроподстановка, после чего получившийся текст снова разбирается от начала макроподстановки и к этому тексту снова будут применяться имеющиеся на данный момент макроопределения, за исключением уже применённых (во избежание рекурсии). Хотя вот это место даже в стандарте описано так, что ничего непонятно.
Порядок появления макроопределений в данном случае не важен, главное чтобы они оба уже встретились до того как понадобится их применение. тогда да, все корректно понимает компилятор #define Min( A, B ) A<B ? A:B с этим- надо скобочки ставить, окружающие буквы, чтобы содержимое А было как единое целое.
|
|
|
|
|
Jun 29 2015, 16:11
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
QUOTE (Метценгерштейн @ Jun 29 2015, 17:33)  с этим- надо скобочки ставить, окружающие буквы, чтобы содержимое А было как единое целое. Без скобок - беда. Только вопрос, где их ставить - лучше привыкать ВСЕГДА АБСОЛЮТНО ВСЕГДА, АВТОМАТИЧЕСКИ НЕ ДУМАЯ, ставить их при #define этих самых A и иже с ними. Тогда не надо будет городить специально конструкции со скобками в выражениях, в которых они явно не требуются. QUOTE (Метценгерштейн @ Jun 29 2015, 17:33)  тогда да, все корректно понимает компилятор Ну для начала не компилятор, а препроцессор. И все-же НЕ обязан, поскольку, увы, начинается очевидная зависимость от реализации препроцессора. Как и Min(++i, ++j) от реализации компилятора. QUOTE (CrimsonPig @ Jun 29 2015, 17:15)  Вообще, ТС, завязывали бы вы с макросами, если возможно.. Категорически не могу согласиться. Мысли надо выражать максимально понятно себе и компилятору. Создавать код-макроме в рассчете, что "пристойный компилятор" заоптимизирует и уберет ненужности и глупости.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
Сообщений в этой теме
Метценгерштейн #define Jun 29 2015, 13:43 zltigo QUOTE (Метценгерштейн @ Jun 29 2015, 16:4... Jun 29 2015, 13:50 CrimsonPig Цитата(zltigo @ Jun 29 2015, 14:50) Не до... Jun 29 2015, 14:15  CrimsonPig Цитата(Метценгерштейн @ Jun 29 2015, 15:3... Jun 29 2015, 14:55 Mihey_K Подтверждаю: GCC 4.8 ни единого предупреждения даж... Jun 29 2015, 14:34 Mihey_K А это уже некорректно: Min(++i, ++j);
Подобную зап... Jun 29 2015, 15:23 Mihey_K Цитатаначинается очевидная зависимость от реализац... Jun 29 2015, 16:20 ViKo Не уверен, что вопрос уже не задавался, напишу в п... Aug 28 2015, 10:44 SSerge Цитата(ViKo @ Aug 28 2015, 17:44) Провери... Aug 28 2015, 11:47 Mihey_K Все правильно вы сделали, LL для long long, и эта ... Aug 28 2015, 11:18 ViKo Цитата(Mihey_K @ Aug 28 2015, 14:18) Все ... Aug 28 2015, 11:27 ViKo Что же он (препроцессор), то считает, то не считае... Aug 28 2015, 12:24 Mihey_K Препроцессор может считать только предопределенные... Aug 28 2015, 14:05 ViKo Цитата(Mihey_K @ Aug 28 2015, 17:05) Преп... Aug 28 2015, 17:08  SSerge Цитата(ViKo @ Aug 29 2015, 00:08) Так
#d... Aug 28 2015, 18:57
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|