Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Builder 2007 min/max
|
|||
|---|---|---|---|
|
#18+
Здравствуйте! Может Кто-нибудь доходчиво объяснить Тупорылому, что за фигня такая у Borland (читать CodeGear) с Макросами min и max? Берётся довольно простой Проект на Microsoft Visual C++ без использования MFC, ATL и вообще самодостаточный (как казалось). При компиляции Проекта, который до этого компилировался в "Microsoft Visual Studio 2008 Version 9.0.21022.8 RTM" выдало следующее: Код: plaintext Используется CodeGear™ RAD Studio 2007 Version 11.0.2902.10471 Copyright © 2007 CodeGear™. В Хелпе написано, что Макрос должен быть определён так: Код: plaintext Я, конечно могу так написать в том же StdAfx.H, но понять хочется, что именно CodeGear перемудрили. P.S. Кажется, эта фигня началась с Builder 6.0. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.05.2008, 18:28 |
|
||
|
Builder 2007 min/max
|
|||
|---|---|---|---|
|
#18+
2 Считающий: Есть два min/max: 1. Макросы в windows.h (точнее, windef.h): windef.h Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Чтобы от них избавиться, перед включением windows.h надо определить макрос NOMINMAX: Код: plaintext 1. 2. 2. Шаблоны функций в STL (заголовочный файл algorithm): Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. Чтобы избежать головной боли, я не использую ни те, ни другие. Использую свои велосипедики. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2008, 01:05 |
|
||
|
Builder 2007 min/max
|
|||
|---|---|---|---|
|
#18+
Ну вот пришлось пока тоже обойтись своими, как было справедливо подмечено, Велосипедиками (с отличными от Оригинальных именами): Код: plaintext 1. 2. 3. 4. 5. 6. Algorithm Мне, пока, ни к чему, потому не используется, просто хочется Прогу писать так, чтобы разными Компиляторами компилилась, хотя бы Visual C++ и C++ Builder. При этом, опять таки, хочется избежать множественного включения подобной чешуи: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2008, 13:11 |
|
||
|
Builder 2007 min/max
|
|||
|---|---|---|---|
|
#18+
2 Считающий: Считающий Код: plaintext 1. Зачем абсолютное значение макросом делать? Для целых чисел (тип int) можно использовать функцию abs из stdlib.h, для чисел с плавающей запятой (тип double) можно использовать функцию fabs из math.h. Считающий Код: plaintext 1. 2. Такие псевдо-функции -- это грабли, потому что один из «параметров» вычисляется дважды. Лучше сделать шаблоны функций: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. Код: plaintext 1. 2. Считающий Но всё же хотелось бы понять, из-за чего такие качели в самых простых, казалось бы, вещах? Исторически сложилось так, что в «виндовом» 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. (я поменял форматирование кода, чтобы было читабельнее) Считающий Algorithm Мне, пока, ни к чему, потому не используется, просто хочется Прогу писать так, чтобы разными Компиляторами компилилась, хотя бы Visual C++ и C++ Builder. При этом, опять таки, хочется избежать множественного включения подобной чешуи: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. Чтобы иметь переносимые (между компиляторами) минимум/максимум, проще велосипедики сделать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2008, 11:08 |
|
||
|
Builder 2007 min/max
|
|||
|---|---|---|---|
|
#18+
Пётр СедовЧтобы иметь переносимые (между компиляторами) минимум/максимум, проще велосипедики сделать.Или пользоваться STL. на то она и стандартная библиотека. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2008, 11:33 |
|
||
|
Builder 2007 min/max
|
|||
|---|---|---|---|
|
#18+
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 – это тоже Стандартная Библиотека, оказалось, что не совсем... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2008, 12:11 |
|
||
|
Builder 2007 min/max
|
|||
|---|---|---|---|
|
#18+
Считающий2 egorych: А Я полагал, что StdLib.H – это тоже Стандартная Библиотека, оказалось, что не совсем...stdlib.h действительно, стандартная, а вот stdafx.h - уже не совсем. майкрософт специфик, однако ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2008, 12:15 |
|
||
|
Builder 2007 min/max
|
|||
|---|---|---|---|
|
#18+
вот, слепил на 2007й стройке, никаких проблем не обнаружил: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2008, 12:25 |
|
||
|
Builder 2007 min/max
|
|||
|---|---|---|---|
|
#18+
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 тоже подобными вещами грешит - потеря Опций Проекта при переходе на более позднюю Версию ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2008, 13:30 |
|
||
|
Builder 2007 min/max
|
|||
|---|---|---|---|
|
#18+
2 egorych: Кстати, если слепить Новый Проект, то действительно всё находит. Фигня только при переносе, придётся опять копать в Глубину... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2008, 13:42 |
|
||
|
Builder 2007 min/max
|
|||
|---|---|---|---|
|
#18+
я вот когда и под Visual Studio проекты делаю, от stdafx.* избавляюсь как от чумы. Потому как таки специфик. Разные компиляторы по разному обрабатывают прекомпилед хидеры. У мелкомягких - это stdafx, у борланда - #pragma hdrstop, etc. Если нет желания заморачиваться с условной компиляцией (пример которой вы опубликовали) и морщить мозг в попытках разобраться что именно стоит за использованием того или иного механизма у каждого конкретного производителя компилятора, то лучше пользоваться возможностями языка, описанными в стандарте. Кстати, мой пример нормально компилируется 2005й студией, и уверен, что и любой другой компилятор C++ нормально справится. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2008, 13:43 |
|
||
|
Builder 2007 min/max
|
|||
|---|---|---|---|
|
#18+
2 egorych: Так что же получается, что Builder не подключает "XUtility", в котором и описаны min и max, только из-за того, что в Проекте используется StdAfx, в котором подключается StdLib.H? Вполне могу в Это поверить, особенно за счёт #pragma once, но всё же непонятно - должны же Производители были предусмотреть хотя бы такую "элементарную вещь", как min и max... Или это "Самые Крутые" Функции Языка C++? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2008, 13:58 |
|
||
|
Builder 2007 min/max
|
|||
|---|---|---|---|
|
#18+
Считающий2 egorych: Так что же получается, что Builder не подключает "XUtility", в котором и описаны min и max, только из-за того, что в Проекте используется StdAfx, в котором подключается StdLib.H? Вполне могу в Это поверить, особенно за счёт #pragma once, но всё же непонятно - должны же Производители были предусмотреть хотя бы такую "элементарную вещь", как min и max... Или это "Самые Крутые" Функции Языка C++?не уловил, как это не предусмотрели? вон пример, нормально компилится, вычисляет тоже корректно, претензии непонятны. З.Ы. директива #pragma once не поддерживается компиляторами Борланд З.Ы.Ы. файл xutility входит в состав компиляторов Борланд, min и max определены там. Можно открыть и посмотреть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2008, 14:09 |
|
||
|
Builder 2007 min/max
|
|||
|---|---|---|---|
|
#18+
Открыл, посмотрел, не понял, почему Он подключается когда делаю Новый Проект и не подключается, когда просто перетаскиваю Код из Visual C++ Проекта. Поигрался с "__MINMAX_DEFINED" - не помогло. Наверное, всё-таки Совместимость не совсем полная... В общем, придётся обходиться Велосипедиками, надоело копаться по Исходникам Borland в поисках Правды... Радует, хотя бы то, что Builder понимает Код: plaintext 1. Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2008, 14:36 |
|
||
|
Builder 2007 min/max
|
|||
|---|---|---|---|
|
#18+
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. А причём здесь stdlib.h? Насколько я знаю, чтобы использовать std::min и std::max, надо подключить стандартный заголовочный файл algorithm. Ну и в Visual C++ 6.0 это не компилируется: Код: plaintext 1. 2. 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2008, 18:28 |
|
||
|
Builder 2007 min/max
|
|||
|---|---|---|---|
|
#18+
Пётр СедовЕсли 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.где только не описаны эти макросы и/или шаблоны!, наблюдается сплошное дублирование кода ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2008, 21:06 |
|
||
|
Builder 2007 min/max
|
|||
|---|---|---|---|
|
#18+
Пётр СедовЧтобы от них избавиться, перед включением windows.h надо определить макрос NOMINMAX: Благодарю. Но к сожалению таких костылей в *.h Visual Studio неимоверное количество. PS: Что мне всегда однозначно всегда не нравилось в C++: - #include; - template; - часто и густо ужасный синтаксис /class, .../ ... бррр ^ ^--- как по мне - это каменный век ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2014, 12:29 |
|
||
|
Builder 2007 min/max
|
|||
|---|---|---|---|
|
#18+
Владимир2012Пётр СедовЧтобы от них избавиться, перед включением windows.h надо определить макрос NOMINMAX: Благодарю. Но к сожалению таких костылей в *.h Visual Studio неимоверное количество. Эти "костыли" не в Visual Studio. Во-первых, это WinSDK, а не VS, Во-вторых, определения min/max были там ещё когда даже стандарта С++ не было. Так что это по-любому не проблемы Visual Studio, хотя она их всё же разрешает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2014, 14:24 |
|
||
|
Builder 2007 min/max
|
|||
|---|---|---|---|
|
#18+
... Эти "костыли" не в Visual Studio. Согласен. Сказанное мной сузим до C++. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2014, 14:46 |
|
||
|
Builder 2007 min/max
|
|||
|---|---|---|---|
|
#18+
По-моему, это рекорд - вытянуть тему 6-летней давности. Некромантия высшей пробы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2014, 14:52 |
|
||
|
Builder 2007 min/max
|
|||
|---|---|---|---|
|
#18+
... Некромантия высшей пробы Google привел меня к этому topic в котором нашел решение своего вопроса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2014, 14:59 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=35348674&tid=2019256]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
69ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
56ms |
get tp. blocked users: |
1ms |
| others: | 293ms |
| total: | 461ms |

| 0 / 0 |
