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

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

Войти
Регистрация
Восстановить пароль
 
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
#1

Функционально-подобные макросы - C++

17.06.2012, 14:44. Просмотров 719. Ответов 17
Метки нет (Все метки)

Есть переменная
C++
1
std::string Log;
и есть другие переменные, или параметры функции. Например,
C++
1
2
int x;
int y;
Можно ли написать макрос, заменяющий
C++
1
Log<<LOG(x);
на
C++
1
Log<<"<x>"<<std::endl<<"<value>"<<x<<"</value>"<<std::endl<<"<adress>"<<(void *)&x<<"</adress>"<<std::endl<<"</x>"<<std::endl;
, а
C++
1
Log<<LOG(y);
на
C++
1
Log<<"<y>"<<std::endl<<"<value>"<<y<<"</value>"<<std::endl<<"<adress>"<<(void *)&y<<"</adress>"<<std::endl<<"</y>"<<std::endl;
? Как?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.06.2012, 14:44     Функционально-подобные макросы
Посмотрите здесь:

Есть ли подобные книги по С++? - C++
Все книги http://www.cyberforum.ru/cpp-beginners/thread152353.html описывают чисто язык С++. Есть ли подобные книги по С++ как, например,...

uint32, size_t и подобные им - C++
Собственно, в чем смысл данных типов, в отличие от обычных unsigned int, int и подобных им?

Как решать подобные задачи по графике? - C++
Вот собственно говоря задание: Я что-то вообще не могу понять, как выполнять это задание. Считать данные не проблема, а как построить да...

VisuaStudio2012 не принимает fopen() и тому подобные функции - C++
не принимает fopen() и тому подобные функции просит fopen_c() а там другие параметры нужно передавать Как заставить работать fopen()?

Создать калькулятор, который мог бы сразу считать подобные арифметические выражения типа: я 1-22+54+65 - C++
Помогите пожалуйста, очень срочно... Нужно создать калькулятор на с++ который мог бы сразу считать подобные выражения 1-22+54+65

Табуляция, переход на новую строку, конец строки и прочие подобные действия. endl; \n; - C++
Я запутался в этих знаках. Чем они отличаются и почему их часто ставят в разных местах строки? Иногда в начале строки, иногда в конце?...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
CyBOSSeR
Эксперт C++
2299 / 1669 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
17.06.2012, 15:26     Функционально-подобные макросы #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
taras atavin, ну вот не наркоман ли? Это с каких пор у std::string появился оператор <<? И что Вам мешает обычную функцию, которя будут заниматься формированием нужной строки, которую ужу вызовете из макроса после получения имени переменной?
Jtalk
93 / 79 / 4
Регистрация: 13.05.2011
Сообщений: 279
17.06.2012, 15:27     Функционально-подобные макросы #3
C++
1
#define LOG(x) "<" << #x << ">" std::endl << "<value>" << x << "</value>" <<std::endl<<"<adress>"<<(void *)&x<<"</adress>"<<std::endl<<"</" << #x << ">"<<std::endl;
Такое что ли?
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
17.06.2012, 17:30  [ТС]     Функционально-подобные макросы #4
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
taras atavin, ну вот не наркоман ли?
нет, конечно.

Добавлено через 52 секунды
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Это с каких пор у std::string появился оператор <<?
Думал об одном, написал совсем другое.
C++
1
std::ofstream Log;
Добавлено через 51 секунду
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
И что Вам мешает обычную функцию, которя будут заниматься формированием нужной строки, которую ужу вызовете из макроса после получения имени переменной?
Интересно, как функция узнает имя фактического параметра?
CyBOSSeR
Эксперт C++
2299 / 1669 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
17.06.2012, 18:24     Функционально-подобные макросы #5
Цитата Сообщение от taras atavin Посмотреть сообщение
Интересно, как функция узнает имя фактического параметра?
То, что я написал о том, то функцию нужно вызывать ПОСЛЕ получения имени объекта, Вас ни на какие мысли не наводит?
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
18.06.2012, 07:54  [ТС]     Функционально-подобные макросы #6
Так проблема именно в том, как его получить. И про после речи не было.
Jtalk
93 / 79 / 4
Регистрация: 13.05.2011
Сообщений: 279
18.06.2012, 11:34     Функционально-подобные макросы #7
Цитата Сообщение от taras atavin Посмотреть сообщение
Так проблема именно в том, как его получить. И про после речи не было.
Показал же уже, в чем еще проблема?
easybudda
Эксперт С++
9456 / 5469 / 927
Регистрация: 25.07.2009
Сообщений: 10,495
18.06.2012, 12:01     Функционально-подобные макросы #8
Jtalk, поясните, пожалуйста, для чего адрес к void* приводится?
grizlik78
Эксперт С++
1904 / 1436 / 109
Регистрация: 29.05.2011
Сообщений: 2,990
18.06.2012, 12:51     Функционально-подобные макросы #9
Цитата Сообщение от easybudda Посмотреть сообщение
Jtalk, поясните, пожалуйста, для чего адрес к void* приводится?
Если параметром окажется переменная char, то без этого приведения будет плохо. Правда с самим значением в этом случае тоже некая неодназначность получается. Но это не так страшно.
easybudda
Эксперт С++
9456 / 5469 / 927
Регистрация: 25.07.2009
Сообщений: 10,495
18.06.2012, 13:53     Функционально-подобные макросы #10
Цитата Сообщение от grizlik78 Посмотреть сообщение
Если параметром окажется переменная char, то без этого приведения будет плохо.
Проверил - действительно ерунда какая-то получается:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
 
#define DUMP1(x) std::cerr << "Name: " << #x << " Value: " << (x) << " Address: " << &(x) << std::endl;
#define DUMP2(x) std::cerr << "Name: " << #x << " Value: " << (x) << " Address: " << (void*)&(x) << std::endl;
 
int main() {
    char c = 'A';
    
    DUMP1(c);
    DUMP2(c);
    
    return 0;
}
Код
~/cpp/other $ g++ -o dump_x dump_x.cpp 
~/cpp/other $ ./dump_x 
Name: c Value: A Address: A?r?
Name: c Value: A Address: 0xbffffbf8
Но что-то до меня не дойдёт никак, что происходит... Чем адрес переменной char так уникален? С переменными других типов (проверял на int и double) и так, и эдак работает...
ForEveR
В астрале
Эксперт С++
7969 / 4731 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
18.06.2012, 13:58     Функционально-подобные макросы #11
easybudda,
C++
1
2
__ostream_type& 
      operator<<(const void* __p);
C++
1
2
3
  template<typename _CharT, typename _Traits>
    inline basic_ostream<_CharT, _Traits>&
    operator<<(basic_ostream<_CharT, _Traits>& __out, const _CharT* __s);
C++
1
2
3
4
  // Partial specializations
  template<class _Traits>
    inline basic_ostream<char, _Traits>&
    operator<<(basic_ostream<char, _Traits>& __out, const char* __s)
C++
1
2
3
4
  // Signed and unsigned
  template<class _Traits>
    inline basic_ostream<char, _Traits>&
    operator<<(basic_ostream<char, _Traits>& __out, const signed char* __s)
C++
1
2
3
  template<class _Traits>
    inline basic_ostream<char, _Traits> &
    operator<<(basic_ostream<char, _Traits>& __out, const unsigned char* __s)
Evg
Эксперт CАвтор FAQ
17473 / 5711 / 364
Регистрация: 30.03.2009
Сообщений: 15,684
Записей в блоге: 26
18.06.2012, 16:19     Функционально-подобные макросы #12
Цитата Сообщение от Jtalk Посмотреть сообщение
C++
1
#define LOG(x) "<" << #x << ">" std::endl << "<value>" << x << "</value>" <<std::endl<<"<adress>"<<(void *)&x<<"</adress>"<<std::endl<<"</" << #x << ">"<<std::endl;
Такое что ли?
В этой записи можно заменить фрагмент

C++
1
"<" << #x << ">"
на

C++
1
"<" #x ">"
а компилятор сам склеит три строковых литерала в один. По общим правилам склеивания подряд идущих строковых литералов
CyBOSSeR
Эксперт C++
2299 / 1669 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
18.06.2012, 23:53     Функционально-подобные макросы #13
Цитата Сообщение от easybudda Посмотреть сообщение
Но что-то до меня не дойдёт никак, что происходит... Чем адрес переменной char так уникален? С переменными других типов (проверял на int и double) и так, и эдак работает...
Поток же просто воспринимает этот адрес как адрес строки и пытается ее вывести
easybudda
Эксперт С++
9456 / 5469 / 927
Регистрация: 25.07.2009
Сообщений: 10,495
19.06.2012, 00:03     Функционально-подобные макросы #14
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Поток же просто воспринимает этот адрес как адрес строки и пытается ее вывести
Да, понял уже, спасибо!
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
19.06.2012, 07:01  [ТС]     Функционально-подобные макросы #15
Имя фактического параметра макроса берётся по символу # перед формальным?
Evg
Эксперт CАвтор FAQ
17473 / 5711 / 364
Регистрация: 30.03.2009
Сообщений: 15,684
Записей в блоге: 26
19.06.2012, 11:03     Функционально-подобные макросы #16
Цитата Сообщение от taras atavin Посмотреть сообщение
Имя фактического параметра макроса берётся по символу # перед формальным?
# - это конструкция, по которой последующий аргумент превращается препроцессором в строковой литерал

Добавлено через 13 минут
Подробнее см. http://www.cyberforum.ru/blogs/18334/blog100.html раздел 3.3.4
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
19.06.2012, 16:48  [ТС]     Функционально-подобные макросы #17
Ответ получен, проблема решена, от темы отписываюсь.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.11.2014, 18:24     Функционально-подобные макросы
Еще ссылки по теме:

Встроенные макросы - C++
Как заставить работать встроенные макросы? Не отображает! #include &quot;stdafx.h&quot; #include &lt;iostream&gt; using namespace std; int...

Макросы и скрипты (Lua) - C++
У меня тема курсовой - использование языка lua в качестве макросов в языке c++. Ищу в поиске макросы lua, но нахожу только написание...

Не срабатывают макросы в коде - C++
Здравствуйте! Не могу понять, почему не срабатывают макросы в данном коде: #include &lt;iostream&gt; using namespace std; enum...

Как используют макросы? - C++
Здраствуйте, в моем блоге форумчанин с ником Evg посоветовал использовать макрос для вот такой конструкции: i f ( k e y s &amp; ( 0 x 1...


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

Или воспользуйтесь поиском по форуму:
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
16.11.2014, 18:24  [ТС]     Функционально-подобные макросы #18
Цитата Сообщение от easybudda Посмотреть сообщение
Но что-то до меня не дойдёт никак, что происходит... Чем адрес переменной char так уникален?
Тем, что char* (адрес чара) принимается за c-строку, а нужен сам адрес.
Yandex
Объявления
16.11.2014, 18:24     Функционально-подобные макросы
Ответ Создать тему
Опции темы

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