Подтвердить что ты не робот

Макрос и конфликт функций-членов

У меня проблема: std:: numeric_limits:: min() конфликтует с макросом "min", определенным в "windef.h". Есть ли способ разрешить этот конфликт без неопределенного макроса "мин". В приведенной ниже ссылке приведены некоторые подсказки, однако мне не удалось использовать скобки со статической функцией-членом.

Каковы некоторые трюки, которые я могу использовать с макросами?

Спасибо заранее.

4b9b3361

Ответ 1

Обходной путь заключается в использовании скобки: int max = (numeric_limits<int>::max)();

Он позволяет включать windef.h, не требует от вас #undef max (который может иметь неблагоприятные побочные эффекты), и нет необходимости в #define NONIMAX. Работает как шарм!

Ответ 2

Единственное действительно общее решение - не включать windows.h в заголовки.

Этот заголовок является убийцей и делает все, что может, чтобы ваш код взорвался. Он не будет компилироваться без расширения языковых расширений MSVC, и это худший пример злоупотребления макросами, который я когда-либо видел.

Включите его в один .cpp файл, а затем выложите обертки в заголовок, который может использовать остальная часть вашего кода. Если windows.h не отображается, он не может конфликтовать с вашими именами.

Для случая min/max вы можете #define NOMINMAX перед включением windows.h. Затем он не будет определять эти конкретные макросы.

Ответ 3

Да, я встречаю ту же проблему. Я нашел только одно решение:

#ifdef min
#undef min
#endif //min

Поместите его прямо после того, как включили.

Ответ 4

В дополнение к jalf-ответу вы также можете #define WINDOWS_LEAN_AND_MEAN перед включением windows.h. Он избавится от минимальных, максимальных и дополнительных шумов от заголовков окон.

Ответ 5

Dewfy, Проблема с этим решением заключается в том, если вы хотите использовать макросы после закрытия.

Я даже попытался определить NOMINMAX, но он не сработал.

Лучшим решением, которое я нашел, было то, что было у Йоханнеса Шауба:          (std:: numeric_limits:: min)()

Ответ 6

#define NOTHING

int main()
{
  int m = -1;

  m = max( 0, 1 ); // expands max macro

  m = max NOTHING ( 0, 1 ); // error 'max': identifier not found
                            // functions-like macros are defined as an 
                            // identifier immediately followed by a left 
                            // parenthesis - N3690/16.3/10

  m = std::max NOTHING ( 2, 3 ); // NOTHING stops the macro 
                                 // expansion (max is not followed by left 
                                 // parenthesis): std::max is called

  m = (std::max)( 4, 5 ); // the enclosing parenthesis stops the macro 
                          // expansion (max is not followed by left 
                          // parenthesis): std::max is called

  return 0;
}