Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
taras atavin
4204 / 1767 / 211
Регистрация: 24.11.2009
Сообщений: 27,565
1

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

17.06.2012, 14:44. Просмотров 813. Ответов 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;
? Как?
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.06.2012, 14:44
Ответы с готовыми решениями:

C подобные языки
Здравствуйте, недавно заинтересовался, какие вообще существуют C-подобные языки...

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

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

Как решать подобные задания
#include &lt;stdio.h&gt; int a={1, 2, 3, 4, 5, 6, 7, 8}; int f(int n){ if (n&gt;7)...

Как решать подобные задания
#include &lt;stdio.h&gt; int main() { int x = 10; printf(&quot;%d\n&quot;, x &amp; 2); ...

17
CyBOSSeR
Эксперт С++
2310 / 1683 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
17.06.2012, 15:26 2
Лучший ответ Сообщение было отмечено как решение

Решение

taras atavin, ну вот не наркоман ли? Это с каких пор у std::string появился оператор <<? И что Вам мешает обычную функцию, которя будут заниматься формированием нужной строки, которую ужу вызовете из макроса после получения имени переменной?
3
Jtalk
95 / 81 / 3
Регистрация: 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;
Такое что ли?
1
taras atavin
4204 / 1767 / 211
Регистрация: 24.11.2009
Сообщений: 27,565
17.06.2012, 17:30  [ТС] 4
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
taras atavin, ну вот не наркоман ли?
нет, конечно.

Добавлено через 52 секунды
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Это с каких пор у std::string появился оператор <<?
Думал об одном, написал совсем другое.
C++
1
std::ofstream Log;
Добавлено через 51 секунду
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
И что Вам мешает обычную функцию, которя будут заниматься формированием нужной строки, которую ужу вызовете из макроса после получения имени переменной?
Интересно, как функция узнает имя фактического параметра?
0
CyBOSSeR
Эксперт С++
2310 / 1683 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
17.06.2012, 18:24 5
Цитата Сообщение от taras atavin Посмотреть сообщение
Интересно, как функция узнает имя фактического параметра?
То, что я написал о том, то функцию нужно вызывать ПОСЛЕ получения имени объекта, Вас ни на какие мысли не наводит?
0
taras atavin
4204 / 1767 / 211
Регистрация: 24.11.2009
Сообщений: 27,565
18.06.2012, 07:54  [ТС] 6
Так проблема именно в том, как его получить. И про после речи не было.
0
Jtalk
95 / 81 / 3
Регистрация: 13.05.2011
Сообщений: 279
18.06.2012, 11:34 7
Цитата Сообщение от taras atavin Посмотреть сообщение
Так проблема именно в том, как его получить. И про после речи не было.
Показал же уже, в чем еще проблема?
0
easybudda
Модератор
Эксперт CЭксперт С++
10115 / 6023 / 1510
Регистрация: 25.07.2009
Сообщений: 11,418
18.06.2012, 12:01 8
Jtalk, поясните, пожалуйста, для чего адрес к void* приводится?
0
grizlik78
Эксперт С++
1990 / 1480 / 194
Регистрация: 29.05.2011
Сообщений: 3,063
18.06.2012, 12:51 9
Цитата Сообщение от easybudda Посмотреть сообщение
Jtalk, поясните, пожалуйста, для чего адрес к void* приводится?
Если параметром окажется переменная char, то без этого приведения будет плохо. Правда с самим значением в этом случае тоже некая неодназначность получается. Но это не так страшно.
2
easybudda
Модератор
Эксперт CЭксперт С++
10115 / 6023 / 1510
Регистрация: 25.07.2009
Сообщений: 11,418
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) и так, и эдак работает...
0
ForEveR
В астрале
Эксперт С++
7996 / 4755 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 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)
2
Evg
Эксперт CАвтор FAQ
19289 / 7148 / 528
Регистрация: 30.03.2009
Сообщений: 20,000
Записей в блоге: 30
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 ">"
а компилятор сам склеит три строковых литерала в один. По общим правилам склеивания подряд идущих строковых литералов
0
CyBOSSeR
Эксперт С++
2310 / 1683 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
18.06.2012, 23:53 13
Цитата Сообщение от easybudda Посмотреть сообщение
Но что-то до меня не дойдёт никак, что происходит... Чем адрес переменной char так уникален? С переменными других типов (проверял на int и double) и так, и эдак работает...
Поток же просто воспринимает этот адрес как адрес строки и пытается ее вывести
1
easybudda
Модератор
Эксперт CЭксперт С++
10115 / 6023 / 1510
Регистрация: 25.07.2009
Сообщений: 11,418
19.06.2012, 00:03 14
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Поток же просто воспринимает этот адрес как адрес строки и пытается ее вывести
Да, понял уже, спасибо!
0
taras atavin
4204 / 1767 / 211
Регистрация: 24.11.2009
Сообщений: 27,565
19.06.2012, 07:01  [ТС] 15
Имя фактического параметра макроса берётся по символу # перед формальным?
0
Evg
Эксперт CАвтор FAQ
19289 / 7148 / 528
Регистрация: 30.03.2009
Сообщений: 20,000
Записей в блоге: 30
19.06.2012, 11:03 16
Цитата Сообщение от taras atavin Посмотреть сообщение
Имя фактического параметра макроса берётся по символу # перед формальным?
# - это конструкция, по которой последующий аргумент превращается препроцессором в строковой литерал

Добавлено через 13 минут
Подробнее см. http://www.cyberforum.ru/blogs/18334/blog100.html раздел 3.3.4
1
taras atavin
4204 / 1767 / 211
Регистрация: 24.11.2009
Сообщений: 27,565
19.06.2012, 16:48  [ТС] 17
Ответ получен, проблема решена, от темы отписываюсь.
0
taras atavin
4204 / 1767 / 211
Регистрация: 24.11.2009
Сообщений: 27,565
16.11.2014, 18:24  [ТС] 18
Цитата Сообщение от easybudda Посмотреть сообщение
Но что-то до меня не дойдёт никак, что происходит... Чем адрес переменной char так уникален?
Тем, что char* (адрес чара) принимается за c-строку, а нужен сам адрес.
0
16.11.2014, 18:24
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.11.2014, 18:24

Как решать подобные задания
#include &lt;stdio.h&gt; #define IMask 7&lt;&lt;13 #define RMask 7&lt;&lt;10 #define AMask...

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

VisuaStudio2012 не принимает fopen() и тому подобные функции
не принимает fopen() и тому подобные функции просит fopen_c() а там другие...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Опции темы

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