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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.80
NeonLost
Пес войны
74 / 85 / 3
Регистрация: 23.02.2012
Сообщений: 653
#1

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

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

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

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

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

Столкнулся с ошибкой пространства имен - C++
Столкнулся с такой ошибкой: error C2871: System: пространство имен с таким именем не существует. Стоит четвертый Framework. В нем проблема?

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
go
Эксперт C++
3586 / 1366 / 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!
1443 / 1172 / 61
Регистрация: 21.04.2012
Сообщений: 2,451
Завершенные тесты: 3
07.05.2013, 23:24     Область видимости, пространства имен #3
C++
1
2
#define NOMINMAX
#inlcude <windows.h>
должно помочь.

Не по теме:

<trollface>MS VC problems</trollface>

go
Эксперт C++
3586 / 1366 / 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
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,076
Записей в блоге: 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
Пес войны
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++
3586 / 1366 / 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
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 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++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
08.05.2013, 13:42     Область видимости, пространства имен #14
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
, заметь темплєйт будет простой перегрузкой, не надо будет undef никаких.
Вот сижу и думаю как мне написать std::max и CreateFile в одной функции заюзать. Может -=ЮрА=-, подскажет???
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.05.2013, 13:44     Область видимости, пространства имен
Еще ссылки по теме:

Неименованные пространства имен - разобрать код - C++
Всем доброго дня !!! При изучении темы неименованные пространства имен столкнулся с проблемой. Автор привел такой код. В...

Как избавиться от явного указания пространства имен - C++
Есть класс, который нужно вынести в другой файл. Соответственно что делаю: 1. Описание класса в *.h файл 2. Реализацию методов...

Область видимости - C++
func { int someVariable; { int someVariable; //можно ли как нибудь получить доступ к переменной...

Область видимости - C++
Даю фрагмент программы: #include &lt;iostream&gt; #include &lt;stdio.h&gt; #include &lt;cmath&gt; struct elem //тип элемента двусвязного списка ...

Область видимости в С++ - C++
В книге С++ Бархатный путь. ( http://khpi-iip.mipk.kharkiv.edu/library/extent/prog/cppvw/cpp_047.html) сказано, что область действия имен...


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

Или воспользуйтесь поиском по форуму:
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 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()
{
}
Yandex
Объявления
08.05.2013, 13:44     Область видимости, пространства имен
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru