Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Builder 2007 min/max / 22 сообщений из 22, страница 1 из 1
31.05.2008, 18:28
    #35347253
Считающий
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Builder 2007 min/max
Здравствуйте!
Может Кто-нибудь доходчиво объяснить Тупорылому, что за фигня такая у Borland (читать CodeGear) с Макросами min и max?
Берётся довольно простой Проект на Microsoft Visual C++ без использования MFC, ATL и вообще самодостаточный (как казалось). При компиляции Проекта, который до этого компилировался в "Microsoft Visual Studio 2008 Version 9.0.21022.8 RTM" выдало следующее:
Код: plaintext
[BCC32 Error] Proga.CPP(510): E2268 Call to undefined function 'max'
Файл StdLib.H подключается ещё из StdAfx.H, Я его открываю и нахожу там какой-то гон про неправильные типы в MFC, но в любом случае вижу описания min и max хотя бы через unsigned long, так что ошибка, по идее, должна быть другая?
Используется CodeGear™ RAD Studio 2007 Version 11.0.2902.10471 Copyright © 2007 CodeGear™.
В Хелпе написано, что Макрос должен быть определён так:
Код: plaintext
#define max(a, b)  (((a) > (b)) ? (a) : (b))
С этой формулировкой Я полностью согласен - будет работать с любыми типами данных, для которых определён оператор ">" с максимальной скоростью, только при условии, что аргументы не являются вызовами Функций или слишком громоздкими Выражениями (хотя, возможно, умный Компилятор и такое сможет разрулить без повторного вызова).
Я, конечно могу так написать в том же StdAfx.H, но понять хочется, что именно CodeGear перемудрили.
P.S. Кажется, эта фигня началась с Builder 6.0.
...
Рейтинг: 0 / 0
01.06.2008, 01:05
    #35347441
Пётр Седов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Builder 2007 min/max
2 Считающий:

Есть два min/max:

1. Макросы в windows.h (точнее, windef.h):
windef.h
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
#ifndef NOMINMAX

#ifndef max
#define max(a,b)            (((a) > (b)) ? (a) : (b))
#endif

#ifndef min
#define min(a,b)            (((a) < (b)) ? (a) : (b))
#endif

#endif  /* NOMINMAX */

Чтобы от них избавиться, перед включением windows.h надо определить макрос NOMINMAX:
Код: plaintext
1.
2.
#define NOMINMAX
#include <windows.h>

2. Шаблоны функций в STL (заголовочный файл algorithm):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
namespace std
{

template<class T>
const T& min(const T& a, const T& b);

template<class T, class BinaryPredicate>
const T& min(const T& a, const T& b, BinaryPredicate comp);

template<class T>
const T& max(const T& a, const T& b);

template<class T, class BinaryPredicate>
const T& max(const T& a, const T& b, BinaryPredicate comp);

}

Чтобы избежать головной боли, я не использую ни те, ни другие. Использую свои велосипедики.
...
Рейтинг: 0 / 0
01.06.2008, 13:11
    #35347602
Считающий
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Builder 2007 min/max
Ну вот пришлось пока тоже обойтись своими, как было справедливо подмечено, Велосипедиками (с отличными от Оригинальных именами):
Код: plaintext
1.
2.
3.
4.
5.
6.
// Глобальные Макросы.
#define Abs( X )	( ( ( X ) >=  0  )? ( X ): -( X ) )
#define Min( X, Y )	( ( ( X ) < ( Y ) )? ( X ): ( Y ) )
#define Max( X, Y )	( ( ( X ) > ( Y ) )? ( X ): ( Y ) )
#define NumOf( X )	( sizeof( X ) / sizeof( ( X )[ 0 ] ) )
//————————————————————————————————————————————————————————————————————————————————————————————
Но всё же хотелось бы понять, из-за чего такие качели в самых простых, казалось бы, вещах?
Algorithm Мне, пока, ни к чему, потому не используется, просто хочется Прогу писать так, чтобы разными Компиляторами компилилась, хотя бы Visual C++ и C++ Builder. При этом, опять таки, хочется избежать множественного включения подобной чешуи:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
#if defined (_MSC_VER)
	...
#endif
#if defined (__BORLANDC__)
	...
#endif
#if defined (__GNUC__)
	...
#endif
#if defined (__WATCOMC__)
	...
#endif
#if defined (__IBMC__)
	...
#endif
(Примеры не мои, взяты из Уважаемой Библиотеки :) )
...
Рейтинг: 0 / 0
02.06.2008, 11:08
    #35348463
Пётр Седов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Builder 2007 min/max
2 Считающий:

Считающий
Код: plaintext
1.
#define Abs( X )	( ( ( X ) >=  0  )? ( X ): -( X ) )

Зачем абсолютное значение макросом делать? Для целых чисел (тип int) можно использовать функцию abs из stdlib.h, для чисел с плавающей запятой (тип double) можно использовать функцию fabs из math.h.

Считающий
Код: plaintext
1.
2.
#define Min( X, Y )	( ( ( X ) < ( Y ) )? ( X ): ( Y ) )
#define Max( X, Y )	( ( ( X ) > ( Y ) )? ( X ): ( Y ) )

Такие псевдо-функции -- это грабли, потому что один из «параметров» вычисляется дважды. Лучше сделать шаблоны функций:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
template<class T>
inline T Min(T x, T y)
{
  return x < y ? x : y;
}

template<class T>
inline T Max(T x, T y)
{
  return x > y ? x : y;
}
или просто два набора функций:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
// Min/Max для int

inline int Min(int x, int y)
{
  return x < y ? x : y;
}

inline int Max(int x, int y)
{
  return x > y ? x : y;
}

// Min/Max для double

inline double Min(double x, double y)
{
  return x < y ? x : y;
}

inline double Max(double x, double y)
{
  return x > y ? x : y;
}
Если уж очень хотите использовать именно макросы, то лучше дать им all-caps (все-заглавные) имена, чтобы при чтении кода они в глаза бросались:
Код: plaintext
1.
2.
#define MIN(x, y) ((x) < (y) ? (x) : (y))
#define MAX(x, y) ((x) > (y) ? (x) : (y))

Считающий
Но всё же хотелось бы понять, из-за чего такие качели в самых простых, казалось бы, вещах?

Исторически сложилось так, что в «виндовом» C++ есть два min/max. Поэтому разные компиляторы по-разному выкручиваются из этой ситуации. Например, Visual C++ 6.0 выкручивается так:
заголовочный файл xutility
Код: plaintext
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.
// TEMPLATE FUNCTION max
#ifndef _MAX
  #define _MAX _cpp_max
  #define _MIN _cpp_min
#endif

template<class _Ty>
inline const _Ty& _cpp_max(const _Ty& _X, const _Ty& _Y)
{
  return (_X < _Y ? _Y : _X);
}

// TEMPLATE FUNCTION max WITH PRED
template<class _Ty, class _Pr>
inline const _Ty& _cpp_max(const _Ty& _X, const _Ty& _Y, _Pr _P)
{
  return (_P(_X, _Y) ? _Y : _X);
}

// TEMPLATE FUNCTION min
template<class _Ty>
inline const _Ty& _cpp_min(const _Ty& _X, const _Ty& _Y)
{
  return (_Y < _X ? _Y : _X);
}

// TEMPLATE FUNCTION min WITH PRED
template<class _Ty, class _Pr>
inline const _Ty& _cpp_min(const _Ty& _X, const _Ty& _Y, _Pr _P)
{
  return (_P(_Y, _X) ? _Y : _X);
}

(я поменял форматирование кода, чтобы было читабельнее)

Считающий
Algorithm Мне, пока, ни к чему, потому не используется, просто хочется Прогу писать так, чтобы разными Компиляторами компилилась, хотя бы Visual C++ и C++ Builder. При этом, опять таки, хочется избежать множественного включения подобной чешуи:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
#if defined (_MSC_VER)
	...
#endif
#if defined (__BORLANDC__)
	...
#endif
#if defined (__GNUC__)
	...
#endif
#if defined (__WATCOMC__)
	...
#endif
#if defined (__IBMC__)
	...
#endif

Чтобы иметь переносимые (между компиляторами) минимум/максимум, проще велосипедики сделать.
...
Рейтинг: 0 / 0
02.06.2008, 11:33
    #35348538
egorych
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Builder 2007 min/max
Пётр СедовЧтобы иметь переносимые (между компиляторами) минимум/максимум, проще велосипедики сделать.Или пользоваться STL. на то она и стандартная библиотека.
...
Рейтинг: 0 / 0
02.06.2008, 12:11
    #35348631
Считающий
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Builder 2007 min/max
2 Пётр Седов:
Пётр СедовЗачем абсолютное значение макросом делать?
Для целых – abs(), для __int64 – _abs64(), для double – fabs(), для _complex – _cabs()... Хочется стандартизации. Для чего перегрузку придумали, однако? :)
С Шаблонами пока не разбирался – это мой огромный Минус — буду изучать, но, кажется, это и есть оптимальное Решение.
А что касается набора Функций, то их получится слишком много, ведь придётся описывать не только для int и double, а ещё, как минимум для: unsigned char, signed char, unsigned short, signed short, unsigned int, unsigned __int64, signed __int64, float, long double (хотя по поводу этого – вообще непонятки, похоже, что Visual C++ его просто конвертит в double, но это тема для отдельного флуда), ... Если их все не описать, то можно нарваться на неявное преобразование типов Компилятором, что негативно скажется на производительности. Да и inline-Функции не все компиляторы так красиво раскрывают (смотрел DisAsm)
Что имеется в виду под "в «виндовом» C++"? Это же не API-Функции OS, а средства Языка C++?
От Visual C++ 6.0 ушёл около полугода назад, сейчас юзаю 2008 – там именно через Макросы (StdLib.H)...
По идее, Макросы должны давать самый оптимальный Код, при условии, что аргументы являются простыми переменными. Но в случае навороченных выражений – ясен пень, что Функция будет быстрее, а если к тому же в выражениях используется ++/--, то Макрос вообще посчитает неправильно...
В общем, Спасибо, буду изучать Темплэйты...
2 egorych: А Я полагал, что StdLib.H – это тоже Стандартная Библиотека, оказалось, что не совсем...
...
Рейтинг: 0 / 0
02.06.2008, 12:15
    #35348640
egorych
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Builder 2007 min/max
Считающий2 egorych: А Я полагал, что StdLib.H – это тоже Стандартная Библиотека, оказалось, что не совсем...stdlib.h действительно, стандартная, а вот stdafx.h - уже не совсем. майкрософт специфик, однако
...
Рейтинг: 0 / 0
02.06.2008, 12:25
    #35348674
egorych
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Builder 2007 min/max
вот, слепил на 2007й стройке, никаких проблем не обнаружил:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
#include <stdlib.h>
#include <iostream>

using namespace std;

int main(int argc, char* argv[])
{
	int x =  1 , y =  2 ;

    cout << "x = " << x << ", y = " << y <<endl;
    cout <<"max = " << max(x,y) << ", min = " << min(x,y) << endl;
    
}
...
Рейтинг: 0 / 0
02.06.2008, 13:30
    #35348882
Считающий
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Builder 2007 min/max
2 egorych: StdAfx.H - это просто Хеадер, используемый всеми Файлами Проекта и являющийся частью этого Проекта, изначально нужен для уменьшения Времени Компиляции за счёт Precompiled Headers. Никаких особых Microsoft Specific он не несёт, за исключением того, что в настройках Проекта для Файла StdAfx.CPP установлено "Создавать PCH-Файл", а для всех остальных Файлов Проекта - "Использовать PCH-Файл" (StdAfx.CPP - правой кнопкой/Properties/C/C++/Precompiled Headers). Постольку, поскольку StdAfx.H подключается ко всем остальным Файлам в Проекте, то и Макроопределения логично поместить туда, ничего более :)
В первом посте я и сказал, что фигня происходит при попытке переноса Проекта в Builder, а на Visual C++ 2005/2008 всё компилилось отлично. (за исключением, разьве что, того, что при Upgrade с 2005 на 2008 совершенно похерились настройки Оптимизации и первое, что бросилось в Глаза - это что Прога стала работать в 3 раза медленнее. Пришлось облазить все Свойства Проекта для Конфигурации "Release", чтобы найти и восстановить опции по Оптимизации Кода. Странно, ведь Я их не менял - в 2005 был просто создан новый Проект, а потом переставил на 2008 и такая вот хрень... К слову сказать, Borland тоже подобными вещами грешит - потеря Опций Проекта при переходе на более позднюю Версию )
...
Рейтинг: 0 / 0
02.06.2008, 13:42
    #35348922
Считающий
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Builder 2007 min/max
2 egorych: Кстати, если слепить Новый Проект, то действительно всё находит. Фигня только при переносе, придётся опять копать в Глубину...
...
Рейтинг: 0 / 0
02.06.2008, 13:43
    #35348925
egorych
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Builder 2007 min/max
я вот когда и под Visual Studio проекты делаю, от stdafx.* избавляюсь как от чумы. Потому как таки специфик. Разные компиляторы по разному обрабатывают прекомпилед хидеры. У мелкомягких - это stdafx, у борланда - #pragma hdrstop, etc. Если нет желания заморачиваться с условной компиляцией (пример которой вы опубликовали) и морщить мозг в попытках разобраться что именно стоит за использованием того или иного механизма у каждого конкретного производителя компилятора, то лучше пользоваться возможностями языка, описанными в стандарте. Кстати, мой пример нормально компилируется 2005й студией, и уверен, что и любой другой компилятор C++ нормально справится.
...
Рейтинг: 0 / 0
02.06.2008, 13:58
    #35348980
Считающий
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Builder 2007 min/max
2 egorych: Так что же получается, что Builder не подключает "XUtility", в котором и описаны min и max, только из-за того, что в Проекте используется StdAfx, в котором подключается StdLib.H? Вполне могу в Это поверить, особенно за счёт #pragma once, но всё же непонятно - должны же Производители были предусмотреть хотя бы такую "элементарную вещь", как min и max... Или это "Самые Крутые" Функции Языка C++?
...
Рейтинг: 0 / 0
02.06.2008, 14:09
    #35349015
egorych
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Builder 2007 min/max
Считающий2 egorych: Так что же получается, что Builder не подключает "XUtility", в котором и описаны min и max, только из-за того, что в Проекте используется StdAfx, в котором подключается StdLib.H? Вполне могу в Это поверить, особенно за счёт #pragma once, но всё же непонятно - должны же Производители были предусмотреть хотя бы такую "элементарную вещь", как min и max... Или это "Самые Крутые" Функции Языка C++?не уловил, как это не предусмотрели? вон пример, нормально компилится, вычисляет тоже корректно, претензии непонятны.
З.Ы. директива #pragma once не поддерживается компиляторами Борланд
З.Ы.Ы. файл xutility входит в состав компиляторов Борланд, min и max определены там. Можно открыть и посмотреть.
...
Рейтинг: 0 / 0
02.06.2008, 14:36
    #35349095
Считающий
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Builder 2007 min/max
Открыл, посмотрел, не понял, почему Он подключается когда делаю Новый Проект и не подключается, когда просто перетаскиваю Код из Visual C++ Проекта. Поигрался с "__MINMAX_DEFINED" - не помогло. Наверное, всё-таки Совместимость не совсем полная...
В общем, придётся обходиться Велосипедиками, надоело копаться по Исходникам Borland в поисках Правды...
Радует, хотя бы то, что Builder понимает
Код: plaintext
1.
   __declspec( property( get = GetProp ) ) __int64 AsMyProperty;
Для 6-го пришлось бы переписывать
Код: plaintext
1.
  __property __int64 AsMyProperty = { read=GetProp, nodefault };
...
Рейтинг: 0 / 0
02.06.2008, 18:28
    #35349864
Пётр Седов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Builder 2007 min/max
2 egorych:

egorych Пётр СедовЧтобы иметь переносимые (между компиляторами) минимум/максимум, проще велосипедики сделать.Или пользоваться STL. на то она и стандартная библиотека.
Если Visual C++ 6.0 не актуален, то да. Проблема в том, что реализация STL, поставляемая с Visual C++ 6.0, не содержит std::min и std::max. Вместо них есть std::_cpp_min, std::_cpp_max, _MIN и _MAX (см. выше ). В старом MSDN-е про это сказано:
MSDN 2001-го года
Microsoft-Specific:
To avoid conflicts with min and max in WINDEF.H, use _MIN and _MAX instead. These macros evaluate to _cpp_min and _cpp_max, respectively.
END Microsoft-Specific


egorych
вот, слепил на 2007й стройке,

«2007-ая стройка» -- это C++ Builder 2007?

egorych
никаких проблем не обнаружил:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
#include <stdlib.h>
#include <iostream>

using namespace std;

int main(int argc, char* argv[])
{
	int x =  1 , y =  2 ;

    cout << "x = " << x << ", y = " << y <<endl;
    cout <<"max = " << max(x,y) << ", min = " << min(x,y) << endl;
    
}

А причём здесь stdlib.h? Насколько я знаю, чтобы использовать std::min и std::max, надо подключить стандартный заголовочный файл algorithm.
Ну и в Visual C++ 6.0 это не компилируется:
Код: plaintext
1.
2.
error C2065: 'max' : undeclared identifier
error C2065: 'min' : undeclared identifier

egorych
Разные компиляторы по разному обрабатывают прекомпилед хидеры. У мелкомягких - это stdafx, у борланда - #pragma hdrstop, etc.

Кстати, в Visual C++ тоже есть #pragma hdrstop, и тоже для precompiled headers. Но наверняка работает слегка не так, как в C++ Builder-е :).

egorych
Если нет желания заморачиваться с условной компиляцией (пример которой вы опубликовали) и морщить мозг в попытках разобраться что именно стоит за использованием того или иного механизма у каждого конкретного производителя компилятора, то лучше пользоваться возможностями языка, описанными в стандарте.

Насколько я знаю, в стандарте C++ ничего нет для ускорения компиляции :(.

egorych
Кстати, мой пример нормально компилируется 2005й студией, и уверен, что и любой другой компилятор C++ нормально справится.

Если не считать Visual C++ 6.0 компилятором C++, то наверняка :).

2 Считающий:

Считающий
Пётр СедовЗачем абсолютное значение макросом делать?
Для целых – abs(), для __int64 – _abs64(), для double – fabs(), для _complex – _cabs()... Хочется стандартизации.

Мне вполне хватает стандартных abs(int) и fabs(double). Я не использую __int64 и комплексные числа.

Считающий
А что касается набора Функций, то их получится слишком много, ведь придётся описывать не только для int и double, а ещё, как минимум для: unsigned char, signed char, unsigned short, signed short, unsigned int, unsigned __int64, signed __int64, float,

Мне вполне хватает велосипедных Min/Max для int и double.

Считающий
long double (хотя по поводу этого – вообще непонятки, похоже, что Visual C++ его просто конвертит в double, но это тема для отдельного флуда),

В Visual C++ и double, и long double -- это 64-битное число с плавающей запятой (в стандарте IEEE 754 этот формат называется «double precision»).
В C++ Builder-е long double -- это 80-битное число с плавающей запятой (в стандарте IEEE 754 этот формат называется «double-extended precision»).

Считающий
Если их все не описать, то можно нарваться на неявное преобразование типов Компилятором, что негативно скажется на производительности.

«Медленное» неявное преобразование -- это число с плавающей запятой -> целое число. Остальные неявные преобразования чисел -- мелочь.

Считающий
Да и inline-Функции не все компиляторы так красиво раскрывают (смотрел DisAsm)

А Вы смотрели оптимизированный ассемблерный код?

Считающий
Что имеется в виду под "в «виндовом» C++"?

Я имел в виду C++-программы, у которых в коде есть #include <windows.h>.

Считающий
Это же не API-Функции OS, а средства Языка C++?

Макросы min и max в заголовочном файле windef.h -- это в некотором смысле часть WinAPI, но её можно отключить (определив макрос NOMINMAX до включения windows.h). Шаблоны функций std::min и std::max, доступные после включения заголовочного файла algorithm, -- это часть стандартной библиотеки C++.

Считающий
По идее, Макросы должны давать самый оптимальный Код, при условии, что аргументы являются простыми переменными.

Обычно вычисление минимума/максимума -- это не то место в программе, где надо так тщательно заботиться об эффективности :).

Считающий
Но в случае навороченных выражений – ясен пень, что Функция будет быстрее, а если к тому же в выражениях используется ++/--, то Макрос вообще посчитает неправильно...

Ага, вот здесь грабли и лежат :).

Считающий
Постольку, поскольку StdAfx.H подключается ко всем остальным Файлам в Проекте, то и Макроопределения логично поместить туда, ничего более :)

По-моему, для этих целей лучше сделать отдельный заголовочный файл вроде Common.h или Base.h, а в stdafx.h оставить только #include-ы «тяжёлых» заголовочный файлов, содержимое которых Вы не собираетесь менять.

Считающий
Так что же получается, что Builder не подключает "XUtility", в котором и описаны min и max, только из-за того, что в Проекте используется StdAfx, в котором подключается StdLib.H?

Насколько я знаю, заголовочный файл xutility не является стандартным. Чтобы использовать std::min и std::max, надо подключить стандартный заголовочный файл algorithm.
...
Рейтинг: 0 / 0
02.06.2008, 21:06
    #35350057
egorych
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Builder 2007 min/max
Пётр СедовЕсли Visual C++ 6.0 не актуален, то да. Печально, когда приходится пользоваться древними компиляторами. К сожалению политика MS такова, что просто перейти на след. версию компилятора не так уж и легко. Сочувствую Пётр Седов
«2007-ая стройка» -- это C++ Builder 2007? ага, оно
Пётр СедовА причём здесь stdlib.h? Насколько я знаю, чтобы использовать std::min и std::max, надо подключить стандартный заголовочный файл algorithm. ну это по привычке, с сишных ещё времён на самом деле в стройке было достаточно #include <iostream> а как он уж там их (min и max) находит - разбираться неохота
Пётр Седов
Считающий
Постольку, поскольку StdAfx.H подключается ко всем остальным Файлам в Проекте, то и Макроопределения логично поместить туда, ничего более :)

По-моему, для этих целей лучше сделать отдельный заголовочный файл вроде Common.h или Base.h, а в stdafx.h оставить только #include-ы «тяжёлых» заголовочный файлов, содержимое которых Вы не собираетесь менять. вот здесь абсолютно +1
Пётр Седов Считающий
Так что же получается, что Builder не подключает "XUtility", в котором и описаны min и max, только из-за того, что в Проекте используется StdAfx, в котором подключается StdLib.H?

Насколько я знаю, заголовочный файл xutility не является стандартным. Чтобы использовать std::min и std::max, надо подключить стандартный заголовочный файл algorithm.где только не описаны эти макросы и/или шаблоны!, наблюдается сплошное дублирование кода
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
24.10.2014, 12:29
    #38786521
Владимир2012
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Builder 2007 min/max
Пётр СедовЧтобы от них избавиться, перед включением windows.h надо определить макрос NOMINMAX:

Благодарю.
Но к сожалению таких костылей в *.h Visual Studio неимоверное количество.

PS: Что мне всегда однозначно всегда не нравилось в C++:
- #include;
- template;
- часто и густо ужасный синтаксис /class, .../ ... бррр

^
^--- как по мне - это каменный век
...
Рейтинг: 0 / 0
24.10.2014, 14:24
    #38786662
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Builder 2007 min/max
Владимир2012Пётр СедовЧтобы от них избавиться, перед включением windows.h надо определить макрос NOMINMAX:

Благодарю.
Но к сожалению таких костылей в *.h Visual Studio неимоверное количество.



Эти "костыли" не в Visual Studio. Во-первых, это WinSDK, а не VS,
Во-вторых, определения min/max были там ещё когда даже стандарта С++ не было.
Так что это по-любому не проблемы Visual Studio, хотя она их всё же разрешает.
...
Рейтинг: 0 / 0
24.10.2014, 14:46
    #38786690
Владимир2012
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Builder 2007 min/max
... Эти "костыли" не в Visual Studio.
Согласен.
Сказанное мной сузим до C++.
...
Рейтинг: 0 / 0
24.10.2014, 14:52
    #38786701
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Builder 2007 min/max
По-моему, это рекорд - вытянуть тему 6-летней давности.
Некромантия высшей пробы.
...
Рейтинг: 0 / 0
24.10.2014, 14:59
    #38786711
Владимир2012
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Builder 2007 min/max
... Некромантия высшей пробы
Google привел меня к этому topic в котором нашел решение своего вопроса.
...
Рейтинг: 0 / 0
24.10.2014, 15:42
    #38786772
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Builder 2007 min/max
Один раз я нагуглил полезное решение для себя в sql.ru где решение давал я сам...
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Builder 2007 min/max / 22 сообщений из 22, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]