Странные ошибки C ++ в коде, содержащем вызовы min() / max()
Вопрос
Я вижу странные ошибки, когда мой код на C ++ содержит вызовы min() или max ().Я использую компиляторы Visual C ++.
Решение
Проверьте, включает ли ваш код windows.h заголовочный файл и либо ваш код, либо другие сторонние заголовки имеют свои собственные мин()/макс() определения.Если да, то добавьте свой windows.h включение с определением НОМИНАЛЬНЫЙ МАКСИМУМ вот так:
#define NOMINMAX
#include <windows.h>
Другие советы
Другая возможность может быть связана с побочными эффектами.Большинство макросов min / max будут включать параметры несколько раз и могут выполнять не то, что вы ожидаете.Также могут генерироваться ошибки и предупреждения.
max(a,i++) expands as ((a) > (i++) ? (a) : (i++))Функция () в расширении предназначена для того, чтобы избежать проблем, если вы вызываете ее с помощью формул.Попробуйте увеличить max (a, b + c)после этого i будет либо плюс 1 , либо плюс 2
Поскольку Windows определяет это как макрос в функциональном стиле, доступно следующее обходное решение:
int i = std::min<int>(3,5);
Это работает, потому что макрос min()
расширяется только тогда, когда min
за ним следует (
, и не тогда, когда за ним следует <
.
Тьфу...сделай это, чувак: std::min()
, std::max()
.
Я не пользовался им много лет, но из-за увеличения памяти, возможно, также назначаются min и max?
Честно говоря, когда дело доходит до min / max, я считаю, что лучше всего просто определить свой собственный:
#define min(a,b) ((a) < (b) ? (a) : (b))
#define max(a,b) ((a) >= (b) ? (a) : (b))