Мешают define макросы min и max
Я программирую в среде Visual Studio 2017 на C++14. Проблема в том, что когда я пишу std::min и std::max , я получаю сообщение от компилятора «Требуется идентификатор». Это возникает из-за define, который подставляет вместо имён функций другой код. Я использую библиотеки glad и glfw3 для работы с OpenGL, а сам define лежит в minwindef.h
#ifndef max #define max(a,b) (((a) > (b)) ? (a) : (b)) #endif
Мне не хочется, чтобы этот define применялся к моему коду. Что я могу сделать?
Отслеживать
28.5k 12 12 золотых знаков 58 58 серебряных знаков 118 118 бронзовых знаков
задан 18 окт 2021 в 9:19
ATtiny13a -PU ATtiny13a -PU
145 6 6 бронзовых знаков
Попробуйте начать программу с #define NOMINMAX
18 окт 2021 в 9:22
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
Начните программу со строки
#define NOMINMAX
Она отменяет макросы min и max в стандартных заголовочных файлах Windows.
Отслеживать
ответ дан 18 окт 2021 в 10:36
218k 15 15 золотых знаков 117 117 серебряных знаков 229 229 бронзовых знаков
Есть несколько способов решения проблемы макросов min , max в заголовочных файлах Windows.
- Использовать #define NOMINMAX в коде перед явным или косвенным включением заголовочного файла с определением макросов min , max .
- Иногда бывает не сразу очевидно, где именно стоит добавлять #define NOMINMAX , например, если добавление, казалось бы, в правильном месте не решает проблему. Тогда можно попробовать определить NOMINMAX через дополнительный ключ компилятора:
> cl.exe -DNOMINMAX .
error C3861: ‘min’: identifier not found
В таком случае можно дополнить первое решение внесением стандартных функций std::min , std::max в проблемное пространство имён (откуда возникла ошибка «identifier not found»). Например:
#define NOMINMAX #include namespace Gdiplus
(std::min)(x, y);
max(x, y); // Подстановка макроса #pragma push_macro("max") #undef max std::max(x, y); // Вызов функции #pragma pop_macro("max") max(x, y); // Снова подстановка макроса
min(x,y)
Макрос max() возвращает наибольшее из двух значений, а макрос min() возвращает наименьшее из двух значений. Макросы max() и min() возвращают тот же тип результата, что и их аргументы. Оба аргумента макросов должны иметь один и тот же тип.
Следующая программа иллюстрирует использование макросов max ( ) и min ( ) :
#include
#include
int main ( void )
{
printf ( «max of 10, 20 is %d \n » , max ( 10 , 20 ) ) ;
printf ( «min of 10, 20 is %d \n » , min ( 10 , 20 ) ) ;
return 0 ;
}
Алгоритмы и представления
Алгоритмы представляют специальные функции, которые определены в модуле и выполняются над контейнерами элементов. Разберем наиболее распространенные.
Минимальный и максимальный элементы
Функции std::min_element и std::max_element возвращают минимальный и макисмальный элементы соответственно из некоторого диапазона. В качестве коллекции элементов может выступать контейнер или массив. Диапазон элементов задается начальным и конечным итераторами контейнера/массива.
#include #include #include int main() < std::vectornumbers < 1, 2, 3, 4, 5, 6, 7, 8>; std::cout
Здесь находим минимальный и максимальный элементы вектора numbers. В обоих случаях в качестве диапазона выступает весь контейнер — от итератора begin(numbers) до итератора end(numbers). Результатом каждой функции также является итератор. Потому для получения значения (максимального/минимального значения) применяем операцию разыменования: *std::min_element(. ) . Консольный вывод:
Min: 1 Max: 8
Поскольку диапазон поиска значений представляет необязательно весь контейнер, а может быть только частью контейера, ограниченной итераторами, то мы можем найти максимальное/минимальное значения на каком-то определенном диапазоне, например, от 2-го до предпоследнего элемента:
std::coutТакже для получения мин/макс. значений можно принименять функцию std::minmax_element() , которая также используется итераторы для задания диапазона поиска. Но результат возвращает в виде объекта std::pair :
#include #include #include int main() < std::vectornumbers < 1, 2, 3, 4, 5, 6, 7, 8>; const auto [min, max] = std::minmax_element(begin(numbers), end(numbers)); std::coutФункции min/max/random
компилятор ругается на то что дескать "max это неопределенный идентификатор". так как написать эту функцию?
и ещё: хотел использовать функцию random написал (в другой программе не относящейся к первой проблеме)компилятор пишет мол "слишком много аргументов в вызове функции" но ведь я ему только один аргумент дал, как может быть слишком много аргументов?
94731 / 64177 / 26122 Регистрация: 12.04.2006 Сообщений: 116,782 Ответы с готовыми решениями:
5х5 random массив В главной диагонали найти min и поменять местами max массива
4) 5х5 random массив. в главной диагонали найти min и поменять местами max массива. если одинаковые.Функции max min
не могу написать функцию для вычисления такого рода. Даны натуральные числа k, n, m.min, max функции.
2890 / 1825 / 356 Регистрация: 09.09.2010 Сообщений: 3,841
Даны числа a(1), a(2), , a(2n). Вычислить: 1) max (a(1)+a(2n), a(2)+a(2n-1), , a(n)+a(n+1));и 2).Сообщение от MaxFX
num3=max(num1,num2);Для этой функции надо подключать не stdlib.h, а algorithm.
Добавлено через 1 минуту
Сообщение от MaxFX
Не такой функции в стандарте. Заблокирован Пример на max
1 2 3 4 5 6 7 8 9 10 11#include #include using namespace std; int main () { cout "max(1,2)==" max(1,2) endl; cout "max(2,1)==" max(2,1) endl; cout "max('a','z')==" max('a','z') endl; cout "max(3.14,2.72)==" max(3.14,2.72) endl; return 0; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24#include #include #include int main () { int iSecret, iGuess; /* initialize random seed: */ srand ( time(NULL) ); /* generate secret number: */ iSecret = rand() % 10 + 1; do { printf ("Guess the number (1 to 10): "); scanf ("%d",&iGuess); if (iSecretiGuess) puts ("The secret number is lower"); else if (iSecret>iGuess) puts ("The secret number is higher"); } while (iSecret!=iGuess); puts ("Congratulations!"); return 0; }
12243 / 7373 / 1734
Регистрация: 25.07.2009
Сообщений: 13,5221 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20#include #include #include #define MAX(a, b) ((a) > (b) ? (a) : (b)) #define MIN(a, b) ((a) < (b) ? (a) : (b))#define RANDOM(a) (rand() % (a)) int main(void){ int a, b; srand(time(NULL)); a = RANDOM(100); b = RANDOM(100); printf("A = %d\nB = %d\nMAX = %d\nMIN = %d\n", a, b, MAX(a, b), MIN(a, b)); return 0; }
Регистрация: 29.01.2011
Сообщений: 84
Да ну нафиг у меня max всю жизнь в ioseream лежит12243 / 7373 / 1734
Регистрация: 25.07.2009
Сообщений: 13,522
Регистрация: 22.10.2010
Сообщений: 37
так с random я разобрался. теперь осталось разобраться с max \ min я подключал следующие файлы:1 2 3 4 5 6#include #include #include #include #include #includeвсё это не сделало погоды, компилятор по прежнему не распознает эти функции. меня сбивает с толку что в учебнике по которому я учусь написано что нужно лишь подключить stdlib.h и написать функцию следуйщим образом:
maximum=max(a,b);видимо я что то упустил из виду раз у меня это не работает. не думаю что в учебнике такая конкретная опечатка может быть.
из ответа IrineK'а мало что понял. что такое "coutкто нибудь кому не трудно, напишите пожалуйста программу которая принимала бы 2 числа, с помощью функции определяла какое число больше, и выводила на экран то число которое больше. я попробую на практическом примере разобраться
Регистрация: 22.10.2010
Сообщений: 37
люди мне всё ещё нужна ваша помощь12243 / 7373 / 1734
Регистрация: 25.07.2009
Сообщений: 13,522Сообщение от MaxFX
меня сбивает с толку что в учебнике по которому я учусь написано что нужно лишь подключить stdlib.h и написать функцию следуйщим образом:
Странный у Вас учебник. В мелкомягкой версии stdlib.h действительно присутствуют два макроса
1 2 3 4/* Minimum and maximum macros */ #define __max(a,b) (((a) > (b)) ? (a) : (b)) #define __min(a,b) (((a) < (b)) ? (a) : (b))но в целях переносимости их лучше не использовать. В конце концов две строчки написать, если нужно, не проблема.
Регистрация: 22.10.2010
Сообщений: 37теперь это стало ясно. но у меня возник ещё вопросик: делал программу которая решает квадратные уравнения, писать пришлось в турбоси, в программе использовал функцию pow. в турбоси программа прошла компиляцию успешно и работала без проблем. в визуалс++ этаже программа тоже работала отлично. но вот когда попробовал написать вторую такую же программу в визулс++ то когда использовал функцию pow он кидал ошибку: "больше чем один случай перегруженной функции "pow" соответствует списку параметров". запустить программу через визуалс++ мне не удалось. зато в турбоси обе программы работают отлично. подскажите пожалуйста с чего вдруг визуалс++ не компилирует вторую программу? ведь обе программы написаны одинаково.
12243 / 7373 / 1734
Регистрация: 25.07.2009
Сообщений: 13,522Сообщение от MaxFX
обе программы написаны одинаково.
Хрустальный шар за шкаф закатился. Текст обоих программ выкладывайте.
Регистрация: 22.10.2010
Сообщений: 37первая программа та которая работает и в турбоси и в визуалс++:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97#include #include #include void main () { int inA, inB, inC, help1, help2, help3, X1, X2, count1=0, count2=0, count3=0, count4=0, cast; char V1; // inA/B/C: operators in the equation. // help1/2/3: helping operators. // X1/2: final solution of the equation. // count1: decides if the input is negative or positive // count2: counting the amount of pressing "enter" also it stops the loop // count3: counting the times that loop runs, also it decide to which // variable each number belongs. // count4: counting the erorrs in input if this variable not equal to zero // it means that input was wrong. // V1: variable that get the values from the user // cast: helping variable. clrscr () ; printf ("enter the numbers to the equation\n ax^2+bx+c\n"); while (count23) { scanf ("%c", &V1); if (V1=='-') count1++, count4--; cast=(int)V1; if ((cast>=48) && (cast57)) { count3++; if (count3==1) inA=cast-48; if (count1=1) inA=inA*(-1); if (count3==2) inB=cast-48; if (count1=2) inB=inB*(-1); if (count3==3) inC=cast-48; if (count1=3) inC=inC*(-1); } else count4++; if (cast==10) count2++, count4--; } if (count4>0) printf ("wrong input"); else { if (inA!=0) { help1=pow(inB,2); help2=4*inA*inC; help3=help1-help2; if (help3 >= 0) { help1=sqrt(help3); inB=inB*(-1); X1=inB+help1; X2=inB-help1; inA=inA*2; X1=X1/inA; X2=X2/inA; if (X1==X2) { printf ("this equation has only one solution: X=%d\n", X1); if (X1>0) printf ("factorization of the equation is: (X-%d)(X-%d)", X1, X1); else printf ("factorization of the equation is: (X+%d)(X+%d)", X1, X1); } else { printf ("this equation has two solutions: X1=%d X2=%d\n", X1, X2); if (X1>0) { if (X2>0) printf ("factorization of the equation is: (X-%d)(X-%d)", X1, X2); else printf ("factorization of the equation is: (X-%d)(X+%d)", X1, X2); } else { if (X2>0) printf ("factorization of the equation is: (X+%d)(X-%d)", X1, X2); else printf ("factorization of the equation is: (X+%d)(X+%d)", X1, X2); } } } // this line belongs to (help>0) else printf ("this equation doesn't has solutions"); } // this line belongs to (A==0) if (inA==0) { X2=inC*(-1); X1=X2/inB; printf ("this is linear equation, the intersection points with the axess: (%d,0) ", X1); printf ("(0,%d)", inC); } } getch () ; }
вторая программа которая работает только в турбоси
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115#include #include #include void main () { int count1=0, count2=0, count3=0, count4=0, iden=0, cast, op1, op2, op3, hv1, hv2, hv3, X1, X2; char inp, prin1=253, prin2=241; // count1: controls and stops the loop // count2: decides to which operator each input belongs // count3: decides if the input is positive or negative // count4: control the correction of the input, if this variable doesn't equal to zero it means // that there is invalid input // iden: (identifier) allows to input two-figured numbers, by checking the sequence of input // cast: variable which saves the value that user has entered, after the casting // op1/2/3: (operator 1/2/3) operators of the equation which presents tha 'a', 'b' and 'c' parametrs // hv1/2/3: (Helping Variable) variables that help to solve a equation // X1/2: final solution/s of the equation // inp: (input) variable that gets values from the user // prin1/2: (print) variables which in general that are not necessary, but they allow to print the math symbols printf ("enter the numbers to this equation ax%c%cbx%cc\n", prin1, prin2, prin2); while (count13) { scanf ("%c", &inp); cast=(int)inp; if ((cast>=48) && (cast57)) { if (iden==1) { switch (count2) { case 1: if (count3!=1) op1=(op1*10)+(cast-48); else op1=(op1*10)-(cast-48); break; case 2: if (count3!=2) op2=(op2*10)+(cast-48); else op2=(op2*10)-(cast-48); break; case 3: if (count3!=3) op3=(op3*10)+(cast-48); else op3=(op3*10)-(cast-48); break; } } else { count2++; switch (count2) { case 1: op1=cast-48; if (count3==1) op1=op1*(-1); break; case 2: op2=cast-48; if (count3==2) op2=op2*(-1); break; case 3: op3=cast-48; if (count3==3) op3=op3*(-1); break; } iden++; } } else count4++; if (cast==45) { switch (count2) { case 0: count3=1; break; case 1: count3=2; break; case 2: count3=3; break; case 3: count3=4; break; } } if (cast==10) count1++, count4--, iden--; if (iden==3) iden=0; } if (op1!=0) { hv1=pow(op2,2); // вот тут визуалс++ постояно ругается на эту функцию hv2=4*op1*op3; hv3=hv1-hv2; if (hv3>=0) { X1=op2*(-1)+hv3; X2=op2*(-1)-hv3; X1=X1/(2*op1); X2=X2/(2*op1); if (X1==X2) { printf ("this equation has only one solution: X=%d\n", X1); if (X1>0) printf ("factorization of the equation is: (X-%d)(X-%d)\n", X1, X1); else printf ("factorization of the equation is: (X%d)(X%d)\n", X1, X1); } else { printf ("this equation has two solutions: X1=%d X2=%d\n", X1, X2); if (X1>0) { if (X2>0) printf ("factorization of the equation is: (X-%d)(X-%d)\n", X1, X2); else printf ("factorization of the equation is: (X-%d)(X+%d)\n", X1, X2); } else { if (X2>0) printf ("factorization of the equation is: (X+%d)(X-%d)\n", X1, X2); else printf ("factorization of the equation is: (X+%d)(X+%d)\n", X1, X2); } } } } printf ("OK"); getch (); }