Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.80
NeonLost
Пес войны
 Аватар для NeonLost
74 / 85 / 3
Регистрация: 23.02.2012
Сообщений: 653
07.05.2013, 23:08     Область видимости, пространства имен #1
имею макрос
C++
1
#define max(a,b)    (((a) > (b)) ? (a) : (b))
он определен в Windows.h, который мне нужен в проекте...

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

пишет ошибку, что нехватает параметров
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.05.2013, 23:08     Область видимости, пространства имен
Посмотрите здесь:

Пространства имен и перегрузка функций C++
Пространства имен в Эклипс C++
C++ Использование пространства имен
C++ Использование пространства имен
C++ Столкнулся с ошибкой пространства имен
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
07.05.2013, 23:21     Область видимости, пространства имен #2
Цитата Сообщение от NeonLost Посмотреть сообщение
каким с чего компилятор решил, что мне нужно использовать макрофункцию?..и как это вылечить?..)
Прочитайте про макро-подстановку. Подумайте, что будет после препроцессирования.

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

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

Не по теме:

<trollface>MS VC problems</trollface>

go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
07.05.2013, 23:35     Область видимости, пространства имен #4
Цитата Сообщение от 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 у меня.
castaway
Эксперт С++
4837 / 2976 / 367
Регистрация: 10.11.2010
Сообщений: 11,008
Записей в блоге: 10
Завершенные тесты: 1
07.05.2013, 23:38     Область видимости, пространства имен #5
Цитата Сообщение от NeonLost Посмотреть сообщение
он определен в Windows.h
Серьёзно? Лично у меня (думаю как и у всех остальных) он определен в stdlib.h
Да и по логике, этот макрос не похож на WinAPI-вский.
-=ЮрА=-
Заблокирован
Автор FAQ
08.05.2013, 09:17     Область видимости, пространства имен #6
Сообщение было отмечено автором темы, экспертом или модератором как ответ
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
NeonLost
Пес войны
 Аватар для NeonLost
74 / 85 / 3
Регистрация: 23.02.2012
Сообщений: 653
08.05.2013, 10:19  [ТС]     Область видимости, пространства имен #7
Цитата Сообщение от go Посмотреть сообщение

Да и он в файле minwindwf.h у меня.
ададда, у меня тоже...разобрался, спасибо...)
go
08.05.2013, 11:12
  #8

Не по теме:

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

-=ЮрА=-
Заблокирован
Автор FAQ
08.05.2013, 11:16     Область видимости, пространства имен #9
Цитата Сообщение от go Посмотреть сообщение
Вам следовало бы вникнуть в суть проблемы, а не "лишь бы ляпнуть..."
ой не начинай опять - риал достал меня уже за это время. Вот только недавно удалил тебя из совего бана, но опять в него могу закинуть.
Теперь к задаче - я вникся в неё больше чем кто-либо, потому и предложил лучшую чем undef альтернативу. define это пержиток Си и в плюсах юзается благодаря совместимости.

Не по теме:

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

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

Не по теме:

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



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

Не по теме:

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

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



ЗЫ: go это так почитать http://ru.wikipedia.org/wiki/C%2B%2B
Избыточные и опасные возможности
Макросы (#define) являются мощным, но опасным средством. Они сохранены в C++ несмотря на то, что необходимость в них, благодаря шаблонам и встроенным функциям, не так уж велика. В унаследованных стандартных C-библиотеках много потенциально опасных макросов.[20]
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
08.05.2013, 13:34     Область видимости, пространства имен #12
-=ЮрА=-,
заметь темплєйт будет простой перегрузкой, не надо будет undef никаких.
Темплейт НЕ сможет быть перегрузкой, потому что макросы раскрываются на этапе препроцессинга.
Да, макросы бывают опасны, вопрос лишь в том как ими пользоваться. Может сможете реализовать BOOST_PREPROCESSOR не через макросы?
-=ЮрА=-
Заблокирован
Автор FAQ
08.05.2013, 13:39     Область видимости, пространства имен #13
Цитата Сообщение от 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 тоже, не вижу надобности. Всё можно реализовать - зная цель, что-то можно обойти что то заменить было бы желание

go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
08.05.2013, 13:42     Область видимости, пространства имен #14
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
, заметь темплєйт будет простой перегрузкой, не надо будет undef никаких.
Вот сижу и думаю как мне написать std::max и CreateFile в одной функции заюзать. Может -=ЮрА=-, подскажет???
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
08.05.2013, 13:44     Область видимости, пространства имен #15
-=ЮрА=-, Ты утвеждаешь, что
Заметь 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()
{
}
-=ЮрА=-
Заблокирован
Автор FAQ
08.05.2013, 13:49     Область видимости, пространства имен #16
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, я уже говорил , что тот кто захочет - тот мою мысль поймёт, кто не захочет - тот всегда будет о чём-то со мной спорить. Посмотри внимательно мои линки на кодпад.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
08.05.2013, 13:53     Область видимости, пространства имен #17
-=ЮрА=-, Ты влез в вопрос действительно не понимая его сути... Человек спрашивал как сделать возможным использование
C++
1
std::numeric_limits<T>::max()
, т.к. ему вылетала ошибка из-за макроса, предопределенного в другом заголовочном файле (НЕ автора), на что ему посоветовали, либо
C++
1
#define NO_MINMAX
, либо
C++
1
#undef max
, это является единственными корректными ответами на вопрос автора.
-=ЮрА=-
Заблокирован
Автор FAQ
08.05.2013, 14:06     Область видимости, пространства имен #18
Цитата Сообщение от 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, не ведись на поводу своих соратников это по меньшей мере некрасиво!

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

Хотя, возможно я неверно понял вопрос, потому что задан он довольно странно, с одной стороны можно предположить, что автору нужен файл Windows.h в проекте и тогда твой ответ некорректен, с другой стороны можно предположить, что автору нужен именно макрос max, для чего он и включил Windows.h, в данном случае твой ответ корректен.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.05.2013, 14:59     Область видимости, пространства имен
Еще ссылки по теме:

Отличия пространства имен от структуры C++
Создание пространства имен C++
Неименованные пространства имен - разобрать код C++

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

Или воспользуйтесь поиском по форуму:
-=ЮрА=-
Заблокирован
Автор FAQ
08.05.2013, 14:59     Область видимости, пространства имен #20
Цитата Сообщение от ForEveR Посмотреть сообщение
Хотя, возможно я неверно понял вопрос, потому что задан он довольно странно, с одной стороны можно предположить, что автору нужен файл Windows.h в проекте и тогда твой ответ некорректен, с другой стороны можно предположить, что автору нужен именно макрос max, для чего он и включил Windows.h, в данном случае твой ответ корректен.
- да с этим соглашусь.

Добавлено через 2 минуты
Цитата Сообщение от ForEveR Посмотреть сообщение
Таким образом, ты косвенным образом предложил залезть в хедер VS и закомментировать макрос там - мне нужно тебе говорить, что это в разы некорректнее остальных 3 способов?
- нет, я всего лишь полагал не использовать define либо закоментировать его определение если он идёт, (пусть это не афишировалось но неявно мной подразумевалось - кустарных методов модификации системных хедеров я не проповедую, при желании можешь посомтреть все мои посты на форуме - модификации никогда не приводил)
Yandex
Объявления
08.05.2013, 14:59     Область видимости, пространства имен
Ответ Создать тему
Опции темы

Текущее время: 16:52. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru