#define VALUE 10#define TMP VALUE
#undef VALUE
#define VALUE (TMP*2)
На момент второго определения VALUE, макрос VALUE не определен, поэтому VALUE определяется, как
(VALUE*2)
, ведь TMP у нас как был, так и остался определен VALUE.
А вот TMP, после второго определения VALUE, раскрывается уже в
(TMP*2)
Как-то так))
В препроцессоре подставляется именно то, что есть и не важно, как это и где определено. Поэтому и аккуратно надо с ним. Пример:
#define min(A,B) ((A)<(B)?(A):(B))
long Foo(int x) {return x*x;}
voidOnStart(void)
{
int a=500,
b=20;
Print(min(500,Foo(b))); //400
}
,а теперь добавим в функцию злое, а именно - побочный эффект
#define min(A,B) ((A)<(B)?(A):(B))
long Foo(int x){
Print("Увидивший это второй раз - нубяра vulgaris");
return x*x;}
voidOnStart(void)
{
int a=500,
b=20;
Print(min(500,Foo(b)));
}
И это всего лишь надпись, а если от этой функции депозит зависит?
правильно понял, после отмены подстановки первая строчка уже не 10 а вторая TMP это VALUE, но не 10. Т.е. подстановка это далеко не присваивание.
Да. Подстановка - это именно подстановка, один в один. Просто когда у тебя, при подстановке в код (не путать с директивой препроцессора) макрос VALUE определен, то препроцессор раскрывает дальше TMP->VALUE->10, а если нет, то TMP->VALUE. При этом, в самом коде диррективы препроцессора не участвуют, при компиляции их уже там нет. Пример:
#define VALUE 10#define TMP VALUE
voidOnStart()
{
Print(TMP); //10if (false){
#undef VALUE
#define VALUE 20Print(TMP);}
elsePrint(TMP); //20
}
Да. Подстановка - это именно подстановка, один в один. Просто когда у тебя, при подстановке в код (не путать с директивой препроцессора) макрос VALUE определен, то препроцессор раскрывает дальше TMP->VALUE->10, а если нет, то TMP->VALUE. При этом, в самом коде диррективы препроцессора не участвуют, при компиляции их уже там нет. Пример:
Да, если закомментить вторую подстановку VALUE 20, уйдет декларация переменной VALUE и компилятор не увидит ее и заругается)
Есть код:
Первая подстановка меняет VALUE на 10 по всему коду до #undef VALUE, остается вот такое:
Следующая подстановка меняет TMP на 10. Получается
Где я туплю?
вместо TMP подставляется не 10, а именно VALUE, а вот потом, если VALUE определен (вот с этим засада), уже 10
Смотри пошагово:
Препроцессор честно подставляет внутрь Print
,после чего, опять же все без обмана, подставляет вместо TMP что? Правильно:
, после чего стирает все диррективы препроцессора и только после этого, компилятору передается вот это:
вместо TMP подставляется не 10, а именно VALUE, а вот потом, если VALUE определен (вот с этим засада), уже 10
Смотри пошагово:
Препроцессор честно подставляет внутрь Print
,после чего, опять же все без обмана, подставляет вместо TMP что? Правильно:
, после чего стирает все диррективы препроцессора и только после этого, компилятору передается вот это:
Это не называется "сверху вниз".
Это не называется "сверху вниз".
Сорри, пока пытался объяснить сам запутался)))
Еще раз:
На момент второго определения VALUE, макрос VALUE не определен, поэтому VALUE определяется, как
(VALUE*2), ведь TMP у нас как был, так и остался определен VALUE.
А вот TMP, после второго определения VALUE, раскрывается уже в
(TMP*2)Как-то так))
В препроцессоре подставляется именно то, что есть и не важно, как это и где определено. Поэтому и аккуратно надо с ним. Пример:
,а теперь добавим в функцию злое, а именно - побочный эффект
И это всего лишь надпись, а если от этой функции депозит зависит?
Все можно, макрос только нужно один добавить
Результат: 20
Все можно, макрос только нужно один добавить
Результат: 20
Это очень хорошо. Загадки плохо получается отгадывать.
Сорри, пока пытался объяснить сам запутался)))
Еще раз:
На момент второго определения VALUE, макрос VALUE не определен, поэтому VALUE определяется, как
, ведь TMP у нас как был, так и остался определен VALUE.
А вот TMP, после второго определения VALUE, раскрывается уже в
Как-то так))
В препроцессоре подставляется именно то, что есть и не важно, как это и где определено. Поэтому и аккуратно надо с ним. Пример:
,а теперь добавим в функцию злое, а именно - побочный эффект
И это всего лишь надпись, а если от этой функции депозит зависит?
смешно) когда дошло)
правильно понял, после отмены подстановки первая строчка уже не 10 а вторая TMP это VALUE, но не 10. Т.е. подстановка это далеко не присваивание.
смешно) когда дошло)
правильно понял, после отмены подстановки первая строчка уже не 10 а вторая TMP это VALUE, но не 10. Т.е. подстановка это далеко не присваивание.
Да. Подстановка - это именно подстановка, один в один. Просто когда у тебя, при подстановке в код (не путать с директивой препроцессора) макрос VALUE определен, то препроцессор раскрывает дальше TMP->VALUE->10, а если нет, то TMP->VALUE. При этом, в самом коде диррективы препроцессора не участвуют, при компиляции их уже там нет. Пример:
Да. Подстановка - это именно подстановка, один в один. Просто когда у тебя, при подстановке в код (не путать с директивой препроцессора) макрос VALUE определен, то препроцессор раскрывает дальше TMP->VALUE->10, а если нет, то TMP->VALUE. При этом, в самом коде диррективы препроцессора не участвуют, при компиляции их уже там нет. Пример:
Да, если закомментить вторую подстановку VALUE 20, уйдет декларация переменной VALUE и компилятор не увидит ее и заругается)
Все можно, макрос только нужно один добавить
Результат: 20
Сдаюсь)))
Как определен
?
Сдаюсь)))
Как определен
?
Так быстро? Еще не все специалисты подключились... неделю подождем
Подсказка: так тоже работает (но решение немного другое)
Результат: 20:15