Но не каждому известен его очень неприятный сюрприз — если аргументом этого макроса установлена функция, значение которой будет максимумом, то она вызовется 2 раза. Со всеми вытекающими последствиями (скорость, корректность).
Проиллюстрирую на примере, который сам проверял:
#define max(a, b)(((a)>(b)) ? (a) : (b))int globalVal = 0;
int f(int a)
{
globalVal++;
return a;
}
int main()
{
int res = max(f(2), 1);// по выполнении этой операции globalVal будет равен двум!return0;
}
Вот и делайте выводы — использовать макрос или функцию ;)
PS. То же самое, разумеется, относится и к макросу min и многим другим.
кстати у меня не компилится просто std::min(a, b) приходится явно указывать std::min<type>(a, b)
при этом если не пишу std:: , то все компилится, но в таком случае я не уверен что в данном месте не подставляется макрос min.
asm du_hast
нехорошо , если будут сравнивать int и unsigned - может получится неверный результат (в асме нету команд сравнения, чтобы один операнд знаковый, а другой беззнаковый)
asm
Так плохо. Тип должен быть один. А если кто-то пытается сравнивать разные типы, то при допустимом кастовании одного типа в другой все отработает как надо. Ну а если нет такого каста, значит сравнивать низя.