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

 
Andrey Khatimlianskii:

Так а почему не работает?

Скорее всего, нигде не работает такой подход. Т.к. идет такая замена, где VALUE справа не определен.

#define VALUE (VALUE*2)
 
fxsaber:

Скорее всего, нигде не работает такой подход. Т.к. идет такая замена, где VALUE справа не определен.

Да и зло это, чужую макроподстановку менять. Тем более, если это предопределенные макросы среды. Мало ли в каком месте, после сборки всех файлов проекта, переопределение макроса в конечном итоге окажется. Лучше уж свой макрос _VALUE определить.
 
Vladimir Simakov:
Да и зло это, чужую макроподстановку менять.

Без этого зла не получилось бы такое.

 
Vladimir Simakov:
Да и зло это, чужую макроподстановку менять. Тем более, если это предопределенные макросы среды. Мало ли в каком месте, после сборки всех файлов проекта, переопределение макроса в конечном итоге окажется. Лучше уж свой макрос _VALUE определить.
Можно вопрос, почему нельзя использовать присвоение значения VALUE глобальной переменной и её умножать и подставлять в конечный дефайн?
 
Valeriy Yastremskiy:
Можно вопрос, почему нельзя использовать присвоение значения VALUE глобальной переменной и её умножать и подставлять в конечный дефайн?

Можно, но тогда смысл макроподстановки теряется (подставить значения в код). Вся надежда на компилятор останется, что он const type (ты, кстати, определился с типом переменной?) преобразует в с++ constexpr type

А так, да, можно

#ifdef MACROS
   const int gValue=2*VALUE;
   #undef VALUE
   #define VALUE gValue
#endif
 
Vladimir Simakov:

А так, да, можно

Не прокатит с таким.

void Func( int = VALUE ) {}
 
fxsaber:

Не прокатит с таким.

Ну да. Еще раз попросим constexpr, что бы вот так можно было
constexpr auto x = 100;

void Foo(int _x = x) {
    std::cout << _x<<std::endl;
}

int main() {
    Foo();
    return 0;
}
 
fxsaber:

Скорее всего, нигде не работает такой подход. Т.к. идет такая замена, где VALUE справа не определен.

Видимо, совсем не понимаю, как работает компилятор. Представлял, что строки анализируются последовательно. Значит, нет неопределенного справа значения:

#define VALUE 10       // VALUE = 10
#define TMP VALUE      // TMP = 10
#undef VALUE           // VALUE = EMPTY
#define VALUE (TMP*2)  // TMP = 10, следовательно VALUE = 20
 
Andrey Khatimlianskii:

Видимо, совсем не понимаю, как работает компилятор. Представлял, что строки анализируются последовательно. Значит, нет неопределенного справа значения:

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

 
Andrey Khatimlianskii:

Видимо, совсем не понимаю, как работает компилятор. Представлял, что строки анализируются последовательно. Значит, нет неопределенного справа значения:

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

#define VALUE (TMP*2)

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

#define VALUE (VALUE*2)

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

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