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

 
 
> #define, вопросы по подстановке
Метценгерштейн
сообщение Jun 29 2015, 13:43
Сообщение #1


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

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



немного не ясен момент один:

#define NUM 10
#define SUMM (NUM+8)

результат понятен.

А если поменять местами дефайны?
#define SUMM (NUM+8)
#define NUM 10

может ли препроцессор заглянуть вниз и увидеть, что NUM ниже есть у него? По описанию- не должен, но реально Keil проглатывает это.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
SSerge
сообщение Jun 29 2015, 14:24
Сообщение #2


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

Группа: Свой
Сообщений: 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.
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение Jun 29 2015, 14:33
Сообщение #3


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

Группа: Свой
Сообщений: 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
с этим- надо скобочки ставить, окружающие буквы, чтобы содержимое А было как единое целое.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jun 29 2015, 16:11
Сообщение #4


Гуру
******

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

Сообщений в этой теме
- Метценгерштейн   #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


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

 


RSS Текстовая версия Сейчас: 11th August 2025 - 10:09
Рейтинг@Mail.ru


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