Ошибки, баги, вопросы - страница 2865

 

Не возможно создать новый продукт для маркета, пишет ошибка 500.

Продукт создан прошел проверки, в ЛК пишет опубликован, но когда переходишь по ссылке получаешь ответ 500.

 
fxsaber:

Работает сверху-вниз, как замена текста. Т.е. "TMP" будет заменен на "VALUE".

Vladimir Simakov:

Это не компилятор - это препроцессор)

превращается в

, а VALUE у тебя не определен

А как должен работать undef?

 
Andrey Khatimlianskii:

А как должен работать undef?

До этого места идет "замена текста".

 
Vladimir Simakov:

Это не компилятор - это препроцессор)

превращается в

, а VALUE у тебя не определен

#define VALUE (VALUE*2)

Я правильно понимаю, тип значения VALUE*2 - const и привязан к самой подстановке, т.е. и VALUE тоже константа. Компилятор создает две константы.

Если так, то наверное создавая новую подстановку 

#define VALUE1 (VALUE*2)
#define VALUE VALUE1

И то не корректно, если VALUE выше по коду была определена константой.

 
fxsaber:

До этого места идет "замена текста".

Не сходится, меняет TMP на VALUE в строке "#define VALUE (TMP*2)", которая после.

 
Andrey Khatimlianskii:

Не сходится, меняет TMP на VALUE в строке "#define VALUE (TMP*2)", которая после.

#define MACROS TEXT
 // В этом интервале везде идет замена в исходнике MACROS на TEXT, как делалось бы в текстовом редакторе.
#undef MACROS
И так идут замены до тех пор, пока все на закончатся.
 
fxsaber:
И так идут замены до тех пор, пока все на закончатся.

Есть код:

#define VALUE 10       // 
#define TMP VALUE      // 
#undef VALUE           // 
#define VALUE (TMP*2)  // 

Первая подстановка меняет VALUE на 10 по всему коду до #undef VALUE, остается вот такое:

#define TMP 10
#define VALUE (TMP*2)

Следующая подстановка меняет TMP на 10. Получается

#define VALUE (10*2)

Где я туплю?

 
Andrey Khatimlianskii:

Есть код:

Первая подстановка меняет VALUE на 10 по всему коду до #undef VALUE, остается вот такое:

Следующая подстановка меняет TMP на 10. Получается

Где я туплю?

вместо TMP подставляется не 10, а именно VALUE, а вот потом, если VALUE определен (вот с этим засада), уже 10

Смотри пошагово:

#define VALUE 10        
#define TMP VALUE       
#undef VALUE            
#define VALUE (TMP*2)

void OnStart(void)
{
   Print(VALUE)
}

Препроцессор честно подставляет внутрь Print

Print((TMP*2));

  ,после чего, опять же все без обмана, подставляет вместо TMP что? Правильно:

Print((VALUE*2));

, после чего стирает все диррективы препроцессора и только после этого, компилятору передается вот это:

void OnStart(void)
{
   Print((VALUE*2));
}
 
Vladimir Simakov:

вместо TMP подставляется не 10, а именно VALUE, а вот потом, если VALUE определен (вот с этим засада), уже 10

Смотри пошагово:

Препроцессор честно подставляет внутрь Print

  ,после чего, опять же все без обмана, подставляет вместо TMP что? Правильно:

, после чего стирает все диррективы препроцессора и только после этого, компилятору передается вот это:

Это не называется "сверху вниз".

 
Andrey Khatimlianskii:

Это не называется "сверху вниз".

Сорри, пока пытался объяснить сам запутался)))

Еще раз:

#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;}

void OnStart(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;}

void OnStart(void)
{
   int a=500,
       b=20;
   Print(min(500,Foo(b)));
}

И это всего лишь надпись, а если от этой функции депозит зависит?

Причина обращения: