Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.69/13: Рейтинг темы: голосов - 13, средняя оценка - 4.69
 Аватар для Izual
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564

Поиск макроса, принимающего строку как параметр

23.08.2014, 04:55. Показов 3106. Ответов 45
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Можно ли данный пример переделать, только чтоб в макрос входила строка, т.е. так: SHOW_DEFINE("WS_VISIBLE");
Пробовал сам удалять stringizing операторы, но что то не получилось.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
char buf[255]="";
#define STR(x) #x
#define SHOW_DEFINE(x) strcmp(STR(x),#x)!=0?strcpy(buf,#x):strcpy(buf,"NOT defined")
int _tmain(int argc, _TCHAR* argv[])
{
    SHOW_DEFINE(WS_VISIBLE);
    cout << buf << endl;
    memset(buf,0,_countof(buf));
    SHOW_DEFINE(WS_VIS);
    cout << buf << endl;
    getch();
    return 0;
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
23.08.2014, 04:55
Ответы с готовыми решениями:

Как передать параметр в запрос не из диалога, а из макроса?
Например, есть база с характеристиками автомобилей в парке, 100-150 или больше, не важно, авто марок Mersedes, VolksWagen, Ford, Skoda. ...

Как подставить значение макроса в строку?
При использовании макросов-констант препроцессора иногда возникает надобность подставлять их значения в строковые литералы программы для...

Параметр в строку подставить как?
Добрый день пишу @set dd = %DATE:~0,2% @set mm = %DATE:~3,2% @set yyyy = %DATE:~6,4% @set needFormat = dd_mm @set login =...

45
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
23.08.2014, 05:46
Не совсем понимаю, зачем нужна именно строка? Может можно иначе будет реализовать.
Ну или подождем, пока гуру проснутся.
0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
23.08.2014, 05:47
Можно узнать - а какой смысл передавать строку?
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
23.08.2014, 13:06
По-моему эта конструкция вообще не работает, т.к. strcmp всегда сравнивает две одинаковые строки.
0
 Аватар для Izual
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
23.08.2014, 13:52  [ТС]
castaway, конструкция работает. Если ввести макрос, который не существует, то метод вернёт "Not defined". Я поэтому и два раза вызов написал, с существующим макросом и не существующим.

Ну вот мне нужна строка... Почему - потому что нужна строка, извините, по другому не объясню.
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
23.08.2014, 14:07
Цитата Сообщение от Izual Посмотреть сообщение
конструкция работает.
Контрпример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <cstring>
 
char buf[255]="";
 
#define STR(x) #x
#define SHOW_DEFINE(x) strcmp(STR(x),#x)!=0?strcpy(buf,#x):strcpy(buf,"NOT defined")
 
int main()
{
    SHOW_DEFINE(MY_MACRO);
    std::cout << buf << std::endl;
 
#define MY_MACRO MY_MACRO
 
    SHOW_DEFINE(MY_MACRO);
    std::cout << buf << std::endl;
}
Логика самого макроса странная, я не знаю чего хотел автор и почему писал именно так.
Цитата Сообщение от Izual Посмотреть сообщение
Ну вот мне нужна строка... Почему - потому что нужна строка, извините, по другому не объясню.
Это не объяснение. Могу только предположить, что хочется во время выполнения программы получать информацию о макросах, которые были на момент сборки. По-простому так сделать нельзя, поскольку после препроцессинга уже выполнены все подстановки препроцессора.
0
 Аватар для Izual
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
23.08.2014, 14:13  [ТС]
Логика макроса: проверить, существует ли макрос, если да - то взять его значение. (это то что я хочу, но вводя макрос через ковычки)
Вот чуть изменил:
C++
1
#define SHOW_DEFINE(x) strcmp(STR(x),#x)!=0?strcpy(buf,STR(x)):strcpy(buf,"NOT defined")
Если макрос найден, то вернёт значение макроса (это будет число типа 0x000000L)
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
23.08.2014, 14:18
Цитата Сообщение от Izual Посмотреть сообщение
проверить, существует ли макрос
Буквально там написано следующее: "Сравнить значение Х с его именем". Причем если Х - это макрос, то будет подставлено его значение. Если значение макроса совпадает с его именем, то в результате наивной проверки считается, что макрос якобы не определен, что и показывает мой пример выше.
0
 Аватар для Izual
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
23.08.2014, 14:25  [ТС]
Вообще если глубже в задачу, то я хотел получить название макроса, что мне и даёт в случае успеха "#x" вот это. Однако я хочу из файла прочитать, т.е. у меня будет название макроса в виде строки.
П.С. Честно говоря я тоже не понимаю как сделан данный метод, а именно почему STR(x) и #x не эквивалентны в случае если нашло.

Добавлено через 3 минуты
0x10, нужно чтоб было в виде строки! Типа этого, но тока чтоб работало:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
char buf[255]="";
#define STR(x) #x
//#define SHOW_DEFINE(x) strcmp(STR(x),#x)!=0?strcpy(buf,#x):strcpy(buf,"NOT defined")
#define SHOW_DEFINE(x) strcmp(STR(x),x)!=0?strcpy(buf,STR(x)):strcpy(buf,"NOT defined")
int _tmain(int argc, _TCHAR* argv[])
{
    SHOW_DEFINE("WS_VISIBLE");
    cout << buf << endl;
    memset(buf,0,_countof(buf));
    SHOW_DEFINE("WS_VIS");
    cout << buf << endl;
    getch();
    return 0;
}
Только вот в STR(x) в этом случае передастся с ковычками, а надо без них...
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
23.08.2014, 14:27
Цитата Сообщение от Izual Посмотреть сообщение
Однако я хочу из файла прочитать
Про проверки на этапе выполнения я уже выше сказал.
0
 Аватар для Izual
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
23.08.2014, 14:34  [ТС]
Цитата Сообщение от 0x10 Посмотреть сообщение
получать информацию о макросах, которые были на момент сборки. По-простому так сделать нельзя, поскольку после препроцессинга уже выполнены все подстановки препроцессора.
Да я слышал, но это противоречит тому что даже в изначальном варианте программа работает. Я могу в ходе работы программы вызывать этот макрос и подставлять например одну из переменных массива DWORD (например если бы я написал:
C++
1
DWORD mmac[5] = {WS_VISIBLE, WS_CHILD, WS_OVERLAPPED, WS_BORDER, WS_DISABLED};
То всё бы работало, однако мне надо конвертирование сделать из char*.
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
23.08.2014, 14:40
Цитата Сообщение от Izual Посмотреть сообщение
Да я слышал, но это противоречит тому что даже в изначальном варианте программа работает.
Лучше один раз посмотрите что происходит с кодом после подстановки, станет все ясно.

Добавлено через 1 минуту
И реквестирую "рабочий" пример с циклом.

Макросы - этап препроцессинга. Не могут они понимать рантайм.
0
 Аватар для Izual
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
23.08.2014, 14:47  [ТС]
Да, однако при массиве "почему то" не работает. Эх, а я то думал что будет работать.
C++
1
2
DWORD mdw[5]={WS_VISIBLE,WS_CHILD,WS_BORDER,WS_DISABLED,WS_TABSTOP};
SHOW_DEFINE(mdw[1]);
Не находит..
А есть какой то другой вариант как в рантайме сделать то что я хочу?
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
23.08.2014, 14:49
Цитата Сообщение от Izual Посмотреть сообщение
Не находит..
Еще раз - смотрим на исходник после препроцессинга и достигаем просветления.

Цитата Сообщение от Izual Посмотреть сообщение
А есть какой то другой вариант как в рантайме сделать то что я хочу?
А теперь вопрос: чего хотите-то? В контексте решаемой задачи, а не на уровне С++.
0
 Аватар для Voivoid
710 / 283 / 16
Регистрация: 31.03.2013
Сообщений: 1,340
23.08.2014, 14:51
Не уверен, что имел в виду топикстартер, но может что-то типа этого:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <string>
 
#include <boost/preprocessor/facilities/is_empty.hpp>
#include <boost/preprocessor/control/if.hpp>
 
#define FOOBAR
#define CHECK( x ) BOOST_PP_IF( BOOST_PP_IS_EMPTY( x ), #x, "NOT DEFINED" );
 
int main() {
 
  std::string s = CHECK( FOOBAR );
 
  return 0;
}
0
 Аватар для Izual
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
23.08.2014, 14:59  [ТС]
Цитата Сообщение от 0x10 Посмотреть сообщение
В контексте решаемой задачи
В рантайме проверить существование макроса, взять название макроса в виде строки(далее эту строку сунуть в combobox), взять его значение.

Boost? Библиотека какая то... Пойду качать чтоб попробовать, а то не находит путь к boost) Хотя не хотелось бы использовать сторонние библиотеки, по возможности
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
23.08.2014, 15:01
Цитата Сообщение от Izual Посмотреть сообщение
В рантайме проверить существование макроса
Ок, меня не поняли.
Сам по себе этот набор действий не имеет смысла. Неоднократно сказал почему. Какой функционал требуется реализовать?
0
 Аватар для Izual
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
23.08.2014, 15:06  [ТС]
Цитата Сообщение от 0x10 Посмотреть сообщение
Какой функционал требуется реализовать?
Цитата Сообщение от Izual Посмотреть сообщение
В рантайме проверить существование макроса, взять название макроса в виде строки(далее эту строку сунуть в combobox), взять его значение.
Какой смысл мне повторять одно и тоже?
Я услышал что макрос для поиска "identifer name" работать не будет в рантайме, но задача от этого не изменилась.
Цитата Сообщение от 0x10 Посмотреть сообщение
Сам по себе этот набор действий не имеет смысла
Это для вас может не имеет, видимо потому что вы не понимаете что я хочу проверить макросы, взять название, взять значение и работать с ними, только в строковом виде.
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
23.08.2014, 15:08
Цитата Сообщение от Izual Посмотреть сообщение
Это для вас может не имеет, видимо потому что вы не понимаете что я хочу проверить макросы, взять название, взять значение и работать с ними, только в строковом виде.
Это я понимаю. Я спрашиваю другое. И уже не знаю как переформулироавть вопрос, чтобы меня услышали.

То, что Вы пишете - это решение. Решение, почти наверняка, неправильное уже в своем подходе. При этом сама проблема сформулирована не была.
Иначе говоря, мой вопрос: для чего это все?
0
 Аватар для Izual
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
23.08.2014, 15:19  [ТС]
Цитата Сообщение от 0x10 Посмотреть сообщение
для чего это все?
Гы))
В combobox, с возможностью check, поместить названия макросов, выберя нужные ссумировать их значения в одно DWORD, как это делает функция CreateWindow например, далее вызвать функцию CreateWindow. Всё это в рантайме.
Хочу переделать вот это:
C++
1
 window[i].style = WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON;
Т.е. если я создам массив DWORD, и в ходе программы создам окно, выбрав нужные стили вызову функцию создания окна. С массивом у меня получилось, но он статический, и в виде DWORD, а я хотел бы из файла прочесть в виде char*.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
23.08.2014, 15:19
Помогаю со студенческими работами здесь

Как при помощи макроса определить последнею строку в таблице
Доброго времени суток! У меня возникла проблема или вернее нехватка знаний непозволяет решить простую задачу :(, а времени в обрез, прошу...

Можно ли передать строку, как параметр?
пример обработчик события, хочу в нем кроме параметров (чисел), передать строку onchange=\&quot;kjobEdit(this.value,$i,($ii+1))\&quot; ...

Как в функцию передать параметр строку?
&lt;script&gt; function loadXMLDoc(&quot;ПАРАМЕТР СТРОКА&quot;) { // &quot;ПАРАМЕТР СТРОКА&quot; var xmlhttp; if (window.XMLHttpRequest) {// code...

Как вернуть удаленную строку после выполнения макроса Rows(n).Delete
Доброго времени суток!) Столкнулся со следующей проблемой, по нажатию кнопки, по заданному номеру строки в текстбоксе, удаляет всю строку....

Получить строку GET запроса, как параметр файла
Добрый день Подскажите пожалуйста Как получить строку GET запроса, как параметр файла Параметр {w:400, h:200}нужно получить именно...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 11.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru