Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.67/21: Рейтинг темы: голосов - 21, средняя оценка - 4.67
Пес войны
 Аватар для NeonLost
111 / 88 / 22
Регистрация: 23.02.2012
Сообщений: 653

Область видимости, пространства имен

07.05.2013, 23:08. Показов 4848. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
имею макрос
C++
1
#define max(a,b)    (((a) > (b)) ? (a) : (b))
он определен в Windows.h, который мне нужен в проекте...

также мне нужна это строчка в коде
C++
1
cin.ignore(std::numeric_limits<streamsize>::max(), '\n');
вопрос...каким с чего компилятор решил, что мне нужно использовать макрофункцию?..и как это вылечить?..)

пишет ошибку, что нехватает параметров
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
07.05.2013, 23:08
Ответы с готовыми решениями:

Не возникает ли коллизия имен, если использовать два пространства имен, и в каждом из них будут одноименные?
Вот например namespace nms1 { int gh; } namespace nms2 { int gh;

Пространства имен в Эклипс
Добрый день. Переношу свой проект из IAR на Eclipse+Yagarto(gcc 4.6.2) Подскажите, из-за чего в hpp модулях проекта может не...

Создание пространства имен
Всем доброго времени суток !!! Не могу понять назначение создания пространств имен. В книге автор привел следующий код программы....

21
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
07.05.2013, 23:21
Цитата Сообщение от NeonLost Посмотреть сообщение
каким с чего компилятор решил, что мне нужно использовать макрофункцию?..и как это вылечить?..)
Прочитайте про макро-подстановку. Подумайте, что будет после препроцессирования.

Добавлено через 14 секунд
Цитата Сообщение от NeonLost Посмотреть сообщение
макрофункцию
Это не функция.

Добавлено через 1 минуту
Вот выход
C++
1
2
3
#ifdef max
#undef max
#endif
1
What a waste!
 Аватар для gray_fox
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
07.05.2013, 23:24
C++
1
2
#define NOMINMAX
#inlcude <windows.h>
должно помочь.

Не по теме:

<trollface>MS VC problems</trollface>

1
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
07.05.2013, 23:35
Цитата Сообщение от NeonLost Посмотреть сообщение
он определен в Windows.h,
А если бы ты еще глянул, как он там определен, то понял бы
C++
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 */
Добавить
C++
1
#define NOMINMAX
Да и он в файле minwindwf.h у меня.
1
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
07.05.2013, 23:38
Цитата Сообщение от NeonLost Посмотреть сообщение
он определен в Windows.h
Серьёзно? Лично у меня (думаю как и у всех остальных) он определен в stdlib.h
Да и по логике, этот макрос не похож на WinAPI-вский.
1
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
08.05.2013, 09:17
Лучший ответ Сообщение было отмечено как решение

Решение

NeonLost, да просто юзай не макросы, а шаблоны (плюсы же как никак)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
using namespace std;
 
template< typename T >
T max( T a, T b )
{
  return a < b ? b : a;
}
 
namespace my
{
    int max(){return 256;}
}
 
int main()
{
    cout<<my::max()<<endl;
    return 0;
}
С макросом не пойдёт : http://codepad.org/4aK4qOOK
С шаблоном покатит : http://codepad.org/uZvN5HvK
3
Пес войны
 Аватар для NeonLost
111 / 88 / 22
Регистрация: 23.02.2012
Сообщений: 653
08.05.2013, 10:19  [ТС]
Цитата Сообщение от go Посмотреть сообщение

Да и он в файле minwindwf.h у меня.
ададда, у меня тоже...разобрался, спасибо...)
0
go
08.05.2013, 11:12
Лучший ответ Сообщение было отмечено как решение

Решение

Не по теме:

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
NeonLost, да просто юзай не макросы, а шаблоны (плюсы же как никак)
Вам следовало бы вникнуть в суть проблемы, а не "лишь бы ляпнуть..."

3
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
08.05.2013, 11:16
Цитата Сообщение от go Посмотреть сообщение
Вам следовало бы вникнуть в суть проблемы, а не "лишь бы ляпнуть..."
ой не начинай опять - риал достал меня уже за это время. Вот только недавно удалил тебя из совего бана, но опять в него могу закинуть.
Теперь к задаче - я вникся в неё больше чем кто-либо, потому и предложил лучшую чем undef альтернативу. define это пержиток Си и в плюсах юзается благодаря совместимости.

Не по теме:

Я тебя прошу пока по нормальному не трогай меня там где не надо, надеюсь на понимание!

0
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
08.05.2013, 12:57
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
ой не начинай опять - риал достал меня уже за это время. Вот только недавно удалил тебя из совего бана, но опять в него могу закинуть.
Теперь к задаче - я вникся в неё больше чем кто-либо, потому и предложил лучшую чем undef альтернативу. define это пержиток Си и в плюсах юзается благодаря совместимости.
ТС не определял этот макрос сам. Он подключил windows.h, который в свою очередь подключил еще какой-то файл, в котором и определен этот макрос. Что я и описал выше.

Не по теме:

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Я тебя прошу пока по нормальному не трогай меня там где не надо, надеюсь на понимание!
Зачем Вы мне, с Вами и поговорить то нельзя.



Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
define это пержиток Си и в плюсах юзается благодаря совместимости.
Да что вы говорите?
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
08.05.2013, 13:31
Цитата Сообщение от go Посмотреть сообщение
Да что вы говорите?
- да то и говорю что у С++ на замену дефам призваны typename и template
Цитата Сообщение от go Посмотреть сообщение
ТС не определял этот макрос сам. Он подключил windows.h, который в свою очередь подключил еще какой-то файл, в котором и определен этот макрос. Что я и описал выше.
- а указанный макрос и коробил все max. На счёт решения собственно вот твои же слова
Цитата Сообщение от go Посмотреть сообщение
Вот выход
#ifdef max
#undef max
#endif
, т.е ты просто предложил отменить макрос. Заметь template в данной ситуации будет простой перегрузкой, не надо будет undef никаких - юзай любую часть кода. В то время, как ниже undef-а, макрос будет недоступен и надо будет объявлять снова (впрочем на основании твоих же ответов не удивлюсь если ты так и поступаешь)
Кликните здесь для просмотра всего текста

Не по теме:

Ладно добавляю в бан снова, коробит общение с подобными тебе личностями:)
Уверен ниже последует
QUOTE

коробит общение с подобными тебе личностями
- мол тебя коробит когда тебе делают замечания или говорят впоперек:DМеня коробит когда люди даже не способні понять что им показали, потому пока нам говорить не о чём



ЗЫ: go это так почитать http://ru.wikipedia.org/wiki/C%2B%2B
Избыточные и опасные возможности
Макросы (#define) являются мощным, но опасным средством. Они сохранены в C++ несмотря на то, что необходимость в них, благодаря шаблонам и встроенным функциям, не так уж велика. В унаследованных стандартных C-библиотеках много потенциально опасных макросов.[20]
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
08.05.2013, 13:34
-=ЮрА=-,
заметь темплєйт будет простой перегрузкой, не надо будет undef никаких.
Темплейт НЕ сможет быть перегрузкой, потому что макросы раскрываются на этапе препроцессинга.
Да, макросы бывают опасны, вопрос лишь в том как ими пользоваться. Может сможете реализовать BOOST_PREPROCESSOR не через макросы?
1
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
08.05.2013, 13:39
Цитата Сообщение от ForEveR Посмотреть сообщение
Темплейт НЕ сможет быть перегрузкой, потому что макросы раскрываются на этапе препроцессинга.
все вызовы max с другим набором параметров будут перегружеными функциями по отношению к
C++
1
2
3
4
5
template< typename T >
T max( T a, T b )
{
  return a < b ? b : a;
}
я писал о том что в коде будут одноверменно доступны все функции max, а не лишь только функция либо только макрос

Добавлено через 1 минуту

Не по теме:

Цитата Сообщение от ForEveR Посмотреть сообщение
Может сможете реализовать BOOST_PREPROCESSOR не через макросы?
-мм к чему мне это?Я не использую буст и большинство фич из С+11 тоже, не вижу надобности. Всё можно реализовать - зная цель, что-то можно обойти что то заменить было бы желание

0
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
08.05.2013, 13:42
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
, заметь темплєйт будет простой перегрузкой, не надо будет undef никаких.
Вот сижу и думаю как мне написать std::max и CreateFile в одной функции заюзать. Может -=ЮрА=-, подскажет???
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
08.05.2013, 13:44
-=ЮрА=-, Ты утвеждаешь, что
Заметь template в данной ситуации будет простой перегрузкой, не надо будет undef никаких - юзай любую часть кода.
template-ы не помогут. Не поможет ничего, кроме специального #define-а или #undef-а. Если в коде встретиться max любой, то он заменится на содержимое макроса, не более того.

Добавлено через 1 минуту
C++
1
2
3
4
5
6
7
8
9
10
11
#define max(a, b) ((a) < (b)) ? (b) : (a)
 
template<typename T>
T max(const T& f, const T& s)
{
   return T();
}
 
int main()
{
}
Bash
1
g++ -E new.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 1 "new.cpp"
# 1 "<command-line>"
# 1 "new.cpp"
 
 
template<typename T>
T ((const T& f) < (const T& s)) ? (const T& s) : (const T& f)
{
   return T();
}
 
int main()
{
}
1
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
08.05.2013, 13:49
ForEveR, я писал о том, что в коде где используется
C
1
#define max(a,b)    (((a) > (b)) ? (a) : (b))
вместо макроса использовать template и для задания автора темы такое решение куда больше будет решением в стиле С++ чем оставить в коде макрос, вот и всё

Добавлено через 2 минуты
Цитата Сообщение от ForEveR Посмотреть сообщение
#define max(a, b) ((a) < (b)) ? (b) : (a)
template<typename T>
T max(const T& f, const T& s)
{
* *return T();
}
- я говорил о таком решении
C++
1
2
3
4
5
6
//#define max(a, b) ((a) < (b)) ? (b) : (a)
template<typename T>
T max(const T& f, const T& s)
{
* *return T();
}
опять же ForEveR, я уже говорил , что тот кто захочет - тот мою мысль поймёт, кто не захочет - тот всегда будет о чём-то со мной спорить. Посмотри внимательно мои линки на кодпад.
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
08.05.2013, 13:53
-=ЮрА=-, Ты влез в вопрос действительно не понимая его сути... Человек спрашивал как сделать возможным использование
C++
1
std::numeric_limits<T>::max()
, т.к. ему вылетала ошибка из-за макроса, предопределенного в другом заголовочном файле (НЕ автора), на что ему посоветовали, либо
C++
1
#define NO_MINMAX
, либо
C++
1
#undef max
, это является единственными корректными ответами на вопрос автора.
1
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
08.05.2013, 14:06
Цитата Сообщение от ForEveR Посмотреть сообщение
.к. ему вылетала ошибка из-за макроса, предопределенного в другом заголовочном файле (НЕ автора), на что ему посоветовали, либо
- во первых Forever чтобы включить макрос max нужно было где то в коде подключить сам windows.h, об этом говорилось. В своём посте 6 я показал что использование макроса несёт за собой весьма тяжёлые последствия для того что под ним (даже для того что идёт в namespace и для
Цитата Сообщение от ForEveR Посмотреть сообщение
std::numeric_limits<T>::max()
в конкретно данном случае)
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
С макросом не пойдёт : http://codepad.org/4aK4qOOK
поэтому ниже я предложил изъять макрос к чертям
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
С шаблоном покатит : http://codepad.org/uZvN5HvK
Опять же вернёмся к словам автора темы
Цитата Сообщение от NeonLost Посмотреть сообщение
он определен в Windows.h, который мне нужен в проекте...
- т.е он подключал windows.h скорее всего из за макроса (я по крайней мере сделал такой вывод), посчитав такой порядок вещей нерациональным я привёл template. Теперь вопрос - я не писал на китайском, давал линки, неужели так трудно было разобрать коды, сравнить и понять мной написанное?

Не по теме:

ЗЫ ForEveR, не ведись на поводу своих соратников это по меньшей мере некрасиво!

0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
08.05.2013, 14:25
-=ЮрА=-, Конечно трудно, ведь автор просто спрашивает как сделать так, чтобы работало. Он не говорил, что он включил файл для макроса. Он просто сказал, что ему нужен этот файл. Не стоит строить догадки, без какой-либо информации по данному поводу. В данном случае, раз файл нужен - остается 4 варианта, #define, #undef, изъять (закомментировать в данном конкретном случае) макрос, включить действительно нужный файл, а не Windows.h (если нужно что-то глубже). Таким образом, ты косвенным образом предложил залезть в хедер VS и закомментировать макрос там - мне нужно тебе говорить, что это в разы некорректнее остальных 3 способов?

Хотя, возможно я неверно понял вопрос, потому что задан он довольно странно, с одной стороны можно предположить, что автору нужен файл Windows.h в проекте и тогда твой ответ некорректен, с другой стороны можно предположить, что автору нужен именно макрос max, для чего он и включил Windows.h, в данном случае твой ответ корректен.
2
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
08.05.2013, 14:59
Цитата Сообщение от ForEveR Посмотреть сообщение
Хотя, возможно я неверно понял вопрос, потому что задан он довольно странно, с одной стороны можно предположить, что автору нужен файл Windows.h в проекте и тогда твой ответ некорректен, с другой стороны можно предположить, что автору нужен именно макрос max, для чего он и включил Windows.h, в данном случае твой ответ корректен.
- да с этим соглашусь.

Добавлено через 2 минуты
Цитата Сообщение от ForEveR Посмотреть сообщение
Таким образом, ты косвенным образом предложил залезть в хедер VS и закомментировать макрос там - мне нужно тебе говорить, что это в разы некорректнее остальных 3 способов?
- нет, я всего лишь полагал не использовать define либо закоментировать его определение если он идёт, (пусть это не афишировалось но неявно мной подразумевалось - кустарных методов модификации системных хедеров я не проповедую, при желании можешь посомтреть все мои посты на форуме - модификации никогда не приводил)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
08.05.2013, 14:59
Помогаю со студенческими работами здесь

Использование пространства имен
Добрый день! Вопрос такой: Для стандартной библиотеки обычно используется пространство имен std, которое подключается через...

Использование пространства имен
Заголовочный файл с осн функциями двунаправленного списка.Нужно построить на его основе стек и очередь с обобщенным интерфейсом т.е...

Использование пространства имен
Написать программу, использующую описанные типы данных: инициализация переменных (ввод пользователя), выполнение действий (в зависимости от...

Отличия пространства имен от структуры
Есть ли разница между пространством имен и структурой? По-моему почти одно и то же

Пространства имен и перегрузка функций
описание: есть библиотека. Пространство имен namespace1, в нем есть несколько перегруженных функций func(). // header.h #ifndef...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru