Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
1

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

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

Author24 — интернет-сервис помощи студентам
Есть переменная
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)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.06.2012, 14:44
Ответы с готовыми решениями:

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

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

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

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

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

Решение

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

Добавлено через 52 секунды
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Это с каких пор у std::string появился оператор <<?
Думал об одном, написал совсем другое.
C++
1
std::ofstream Log;
Добавлено через 51 секунду
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
И что Вам мешает обычную функцию, которя будут заниматься формированием нужной строки, которую ужу вызовете из макроса после получения имени переменной?
Интересно, как функция узнает имя фактического параметра?
0
Эксперт С++
2347 / 1720 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
17.06.2012, 18:24 5
Цитата Сообщение от taras atavin Посмотреть сообщение
Интересно, как функция узнает имя фактического параметра?
То, что я написал о том, то функцию нужно вызывать ПОСЛЕ получения имени объекта, Вас ни на какие мысли не наводит?
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
18.06.2012, 07:54  [ТС] 6
Так проблема именно в том, как его получить. И про после речи не было.
0
95 / 81 / 3
Регистрация: 13.05.2011
Сообщений: 279
18.06.2012, 11:34 7
Цитата Сообщение от taras atavin Посмотреть сообщение
Так проблема именно в том, как его получить. И про после речи не было.
Показал же уже, в чем еще проблема?
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12458 / 7482 / 1753
Регистрация: 25.07.2009
Сообщений: 13,762
18.06.2012, 12:01 8
Jtalk, поясните, пожалуйста, для чего адрес к void* приводится?
0
Эксперт С++
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
18.06.2012, 12:51 9
Цитата Сообщение от easybudda Посмотреть сообщение
Jtalk, поясните, пожалуйста, для чего адрес к void* приводится?
Если параметром окажется переменная char, то без этого приведения будет плохо. Правда с самим значением в этом случае тоже некая неодназначность получается. Но это не так страшно.
2
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12458 / 7482 / 1753
Регистрация: 25.07.2009
Сообщений: 13,762
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
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
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
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 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
Эксперт С++
2347 / 1720 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
18.06.2012, 23:53 13
Цитата Сообщение от easybudda Посмотреть сообщение
Но что-то до меня не дойдёт никак, что происходит... Чем адрес переменной char так уникален? С переменными других типов (проверял на int и double) и так, и эдак работает...
Поток же просто воспринимает этот адрес как адрес строки и пытается ее вывести
1
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12458 / 7482 / 1753
Регистрация: 25.07.2009
Сообщений: 13,762
19.06.2012, 00:03 14
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Поток же просто воспринимает этот адрес как адрес строки и пытается ее вывести
Да, понял уже, спасибо!
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
19.06.2012, 07:01  [ТС] 15
Имя фактического параметра макроса берётся по символу # перед формальным?
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
19.06.2012, 11:03 16
Цитата Сообщение от taras atavin Посмотреть сообщение
Имя фактического параметра макроса берётся по символу # перед формальным?
# - это конструкция, по которой последующий аргумент превращается препроцессором в строковой литерал

Добавлено через 13 минут
Подробнее см. https://www.cyberforum.ru/blogs/18334/blog100.html раздел 3.3.4
1
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
19.06.2012, 16:48  [ТС] 17
Ответ получен, проблема решена, от темы отписываюсь.
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
16.11.2014, 18:24  [ТС] 18
Цитата Сообщение от easybudda Посмотреть сообщение
Но что-то до меня не дойдёт никак, что происходит... Чем адрес переменной char так уникален?
Тем, что char* (адрес чара) принимается за c-строку, а нужен сам адрес.
0
16.11.2014, 18:24
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.11.2014, 18:24
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru