Странные ошибки C++ с кодом, который имеет вызовы min () / max ()

Я вижу странные ошибки, когда в моем коде C++ есть вызовы min () или max (). Я использую компиляторы Visual C++.

Это официально самый странный вопрос о переполнении стека.

eplawless 18.08.2008 08:16
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
7
1
2 115
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Ответ принят как подходящий

Убедитесь, что ваш код включает файл заголовка windows.h, и ваш код или другие сторонние заголовки имеют собственные определения мин () / Максимум(). Если да, то добавьте к включению windows.h определение НОМИНМАКС следующим образом:

#define NOMINMAX
#include <windows.h>

Ух ... разгляди, чувак: std::min(), std::max().

Вам все равно нужно #define NOMINMAX, иначе препроцессор все равно расширит min и max.

Ferruccio 11.09.2008 05:49

Я не использовал его годами, но, возможно, из-за буста памяти также назначаются min и max?

Другая возможность может быть связана с побочными эффектами. Большинство макросов min / max будут включать параметры несколько раз и могут не делать то, что вы ожидаете. Также могут быть сгенерированы ошибки и предупреждения.

max(a,i++) expands as ((a) > (i++) ? (a) : (i++))

afterwards i is either plus 1 or plus 2

The () in the expansion are to avoid problems if you call it with formulae. Try expanding max(a,b+c)

Честно говоря, когда дело доходит до минимума / максимума, я считаю, что лучше просто определить свое собственное:

#define min(a,b) ((a) < (b) ? (a) : (b))
#define max(a,b) ((a) >= (b) ? (a) : (b))

Что, честно говоря, напрашивается на неприятности. В C++ используйте using std::swap и напишите свой собственный своп, если вы можете добиться большего, чем стандартное. На языке C в момент аренды напишите #define min(a,b) ((a) < (b) ? (a) : (b)) и УБЕДИТЕСЬ, ЧТО ВЫ НЕ НАЗЫВАЕТЕ НИЧЕГО С ПОБОЧНЫМИ ЭФФЕКТАМИ, потому что у вас будет множественная оценка.

David Thornley 25.11.2009 01:28

Поскольку Windows определяет это как макрос в стиле функции, доступен следующий обходной путь:

int i = std::min<int>(3,5);

Это работает, потому что макрос min() раскрывается только тогда, когда за min следует (, а не тогда, когда за ним следует <.

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