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

 

Двойная ошибка при выполнении

#define XY( X, Y )      X##Y
#define f( X )  XY( g, X )
#define MACRO1( X )     #X
#define MACRO2( X )     MACRO1( X )
#define SIZE    5
void OnStart()
{
    printf( "%s", MACRO2( f( SIZE )));
}

Результат: f(SIZE)

а должен быть: g5

 
leonerd:

Как убрать стрелки с графика визуализации тестирования? Запускаю тестирование, а там до сих пор стрелки и линии от входов с прошлого теста.

Почистите шаблон tester.tpl, объекты скорее всего там.

 
A100:

Двойная ошибка при выполнении

Результат: f(SIZE)

а должен быть: g5


По-моему, логичный результат.

 
fxsaber:
По-моему, логичный результат.

Ожидалось: Сначала подстановка внутреннего макроса SIZE, затем промежуточного f( X ) и наконец внешнего MACRO2( X )

Но результат отличается даже если использовать незаконченную логику:

#define MACRO1( X )     #X
void OnStart()
{
    printf( "%s", MACRO1( f( SIZE )));
}
//Результат  :f(SIZE)
//должен быть:f( SIZE )

как минимум отличие в пробелах

 
A100:

Ожидалось: Сначала подстановка внутреннего макроса SIZE, затем промежуточного f( X ) и наконец внешнего MACRO2( X )

Но результат отличается даже если использовать незаконченную логику:

как минимум отличие в пробелах

Приоритет у функций, конечно, изнутри наружу. А вот у макросов - наоборот.

#X - строка без пробелов. С этим можно не соглашаться, конечно.

 
fxsaber:

Приоритет у функций, конечно, изнутри наружу. А вот у макросов - наоборот.

#X - строка без пробелов. С этим можно не соглашаться, конечно.

А зачем придумывать новые усложненные правила со старыми обозначениями, если с такими обозначениями уже есть простые старые - известные широкому кругу лиц и устоявшиеся десятилетиями правила? Если правила новые - то и обозначения должны быть новыми

 
A100:

Двойная ошибка при выполнении

Результат: f(SIZE)

а должен быть: g5

Я год назад отправлял аналогичную заявку в сервис-деск (#1600034) , до сих пор висит без ответа.  Похоже им до фени все эти "гиковские" баги.  Да и вообще язык улучшать больше не намерены, судя по всему.  Только крупные баги правят, и не более.
 
A100:

А зачем придумывать новые усложненные правила со старыми обозначениями, если с такими обозначениями уже есть простые старые - известные широкому кругу лиц и устоявшиеся десятилетиями правила? Если правила новые - то и обозначения должны быть новыми

О чем именно речь? И как должно быть?

 
fxsaber:

О чем именно речь? И как должно быть?

#X - строка как есть - т.е. с пробелами (если они есть). И посмотрите пример выше f( SIZE ) -> g5. Я не сам эти правила придумал - так поступают С++ компиляторы

 
Alexey Navoykov:
Я год назад отправлял аналогичную заявку в сервис-деск (#1600034) , до сих пор висит без ответа.  Похоже им до фени все эти "гиковские" баги.  Да и вообще язык улучшать больше не намерены, судя по всему.  Только крупные баги правят, и не более.

Я только вчера случайно столкнулся с этим и был удивлен как в сочетании с

template<typename T, int n>

несколько десятков строк кода буквально превратились в одну-две (!). Потому и написал - на первый взгляд может показаться что ерунда какая-то незначительная. Лишний раз убедился что ерунды в С++ нет

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