*** ВНИМАНИЕ: Блог переехал на другой адрес - demin.ws ***

четверг, 5 марта 2009 г.

Как обойтить без макроса NOMINMAX

В комментариях к посту про проблему конфликта имен STL'евских std::min и std::max с одноименными макросами из файла windows.h мне подсказали интересное решение.

Если вместо, например, std::max(a, b) написать (std::max)(a, b), то результат работы препроцессора выглядит так:
#line 3 "minmax.cpp"
int main() {
int a = (std::min)(10, 20);
return 0;
}
вместо:
#line 3 "minmax.cpp"
int main() {
int a = std::(((10) < (20)) ? (10) : (20));
return 0;
}
и конфликта не происходит. Все компилируется без проблем.

Не берусь судить, на сколько это красивое решение, и я бы все-таки предпочел действовать напрямую через макрос NOMINMAX, но выход элегантный.


Другие посты по теме:

2 комментария:

  1. Я предпочитаю NOMINMAX.
    Вот бы еще было бы средство отключать стандартные макросы из windows.h

    Например:
    У меня в gui была ф.я. MessageBox. пока она не экспортировалась все было ок. Однако потом когда по GetProcAddress я не смог ее получить глянул в таблицу экспотра своего fEngine.dll и увидел там функцию MessageBoxA !!! Пришлось переименовать в MsgBox. Вот так вот.

    Если кто знает способ такого избежать, напишите плиз.

    ОтветитьУдалить
  2. Можно было попробовать сделать
    #undef MessageBoxA

    ОтветитьУдалить