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

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

Восстановить пароль Регистрация
 
 
Izual
 Аватар для Izual
93 / 118 / 6
Регистрация: 13.11.2012
Сообщений: 1,517
23.08.2014, 04:55     Поиск макроса, принимающего строку как параметр #1
Можно ли данный пример переделать, только чтоб в макрос входила строка, т.е. так: 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;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.08.2014, 04:55     Поиск макроса, принимающего строку как параметр
Посмотрите здесь:

Мне надо сделать поиск последнего вхождения подстроки s1 в строку s(с функцией LastPos, не strstr). В этом коде просто вхождение подстроки в строку. C++
C++ Принять в параметр функции строку и вернуть ее же,но измененную
C++ как добавить запятую в аргументы макроса?
появилась загвоздка с функцией. нужно вывести на экран строку, сост. из звездочек. Длина строки-параметр функциииз звезд. длина строки - C++
C++ Как передать элемент структуры, как параметр функции
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
КОП
348 / 280 / 86
Регистрация: 15.08.2010
Сообщений: 755
23.08.2014, 05:46     Поиск макроса, принимающего строку как параметр #2
Не совсем понимаю, зачем нужна именно строка? Может можно иначе будет реализовать.
Ну или подождем, пока гуру проснутся.
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
23.08.2014, 05:47     Поиск макроса, принимающего строку как параметр #3
Можно узнать - а какой смысл передавать строку?
castaway
Эксперт С++
4839 / 2978 / 367
Регистрация: 10.11.2010
Сообщений: 11,012
Записей в блоге: 10
Завершенные тесты: 1
23.08.2014, 13:06     Поиск макроса, принимающего строку как параметр #4
По-моему эта конструкция вообще не работает, т.к. strcmp всегда сравнивает две одинаковые строки.
Izual
 Аватар для Izual
93 / 118 / 6
Регистрация: 13.11.2012
Сообщений: 1,517
23.08.2014, 13:52  [ТС]     Поиск макроса, принимающего строку как параметр #5
castaway, конструкция работает. Если ввести макрос, который не существует, то метод вернёт "Not defined". Я поэтому и два раза вызов написал, с существующим макросом и не существующим.

Ну вот мне нужна строка... Почему - потому что нужна строка, извините, по другому не объясню.
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
23.08.2014, 14:07     Поиск макроса, принимающего строку как параметр #6
Цитата Сообщение от 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 Посмотреть сообщение
Ну вот мне нужна строка... Почему - потому что нужна строка, извините, по другому не объясню.
Это не объяснение. Могу только предположить, что хочется во время выполнения программы получать информацию о макросах, которые были на момент сборки. По-простому так сделать нельзя, поскольку после препроцессинга уже выполнены все подстановки препроцессора.
Izual
 Аватар для Izual
93 / 118 / 6
Регистрация: 13.11.2012
Сообщений: 1,517
23.08.2014, 14:13  [ТС]     Поиск макроса, принимающего строку как параметр #7
Логика макроса: проверить, существует ли макрос, если да - то взять его значение. (это то что я хочу, но вводя макрос через ковычки)
Вот чуть изменил:
C++
1
#define SHOW_DEFINE(x) strcmp(STR(x),#x)!=0?strcpy(buf,STR(x)):strcpy(buf,"NOT defined")
Если макрос найден, то вернёт значение макроса (это будет число типа 0x000000L)
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
23.08.2014, 14:18     Поиск макроса, принимающего строку как параметр #8
Цитата Сообщение от Izual Посмотреть сообщение
проверить, существует ли макрос
Буквально там написано следующее: "Сравнить значение Х с его именем". Причем если Х - это макрос, то будет подставлено его значение. Если значение макроса совпадает с его именем, то в результате наивной проверки считается, что макрос якобы не определен, что и показывает мой пример выше.
Izual
 Аватар для Izual
93 / 118 / 6
Регистрация: 13.11.2012
Сообщений: 1,517
23.08.2014, 14:25  [ТС]     Поиск макроса, принимающего строку как параметр #9
Вообще если глубже в задачу, то я хотел получить название макроса, что мне и даёт в случае успеха "#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) в этом случае передастся с ковычками, а надо без них...
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
23.08.2014, 14:27     Поиск макроса, принимающего строку как параметр #10
Цитата Сообщение от Izual Посмотреть сообщение
Однако я хочу из файла прочитать
Про проверки на этапе выполнения я уже выше сказал.
Izual
 Аватар для Izual
93 / 118 / 6
Регистрация: 13.11.2012
Сообщений: 1,517
23.08.2014, 14:34  [ТС]     Поиск макроса, принимающего строку как параметр #11
Цитата Сообщение от 0x10 Посмотреть сообщение
получать информацию о макросах, которые были на момент сборки. По-простому так сделать нельзя, поскольку после препроцессинга уже выполнены все подстановки препроцессора.
Да я слышал, но это противоречит тому что даже в изначальном варианте программа работает. Я могу в ходе работы программы вызывать этот макрос и подставлять например одну из переменных массива DWORD (например если бы я написал:
C++
1
DWORD mmac[5] = {WS_VISIBLE, WS_CHILD, WS_OVERLAPPED, WS_BORDER, WS_DISABLED};
То всё бы работало, однако мне надо конвертирование сделать из char*.
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
23.08.2014, 14:40     Поиск макроса, принимающего строку как параметр #12
Цитата Сообщение от Izual Посмотреть сообщение
Да я слышал, но это противоречит тому что даже в изначальном варианте программа работает.
Лучше один раз посмотрите что происходит с кодом после подстановки, станет все ясно.

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

Макросы - этап препроцессинга. Не могут они понимать рантайм.
Izual
 Аватар для Izual
93 / 118 / 6
Регистрация: 13.11.2012
Сообщений: 1,517
23.08.2014, 14:47  [ТС]     Поиск макроса, принимающего строку как параметр #13
Да, однако при массиве "почему то" не работает. Эх, а я то думал что будет работать.
C++
1
2
DWORD mdw[5]={WS_VISIBLE,WS_CHILD,WS_BORDER,WS_DISABLED,WS_TABSTOP};
SHOW_DEFINE(mdw[1]);
Не находит..
А есть какой то другой вариант как в рантайме сделать то что я хочу?
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
23.08.2014, 14:49     Поиск макроса, принимающего строку как параметр #14
Цитата Сообщение от Izual Посмотреть сообщение
Не находит..
Еще раз - смотрим на исходник после препроцессинга и достигаем просветления.

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

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;
}
Izual
 Аватар для Izual
93 / 118 / 6
Регистрация: 13.11.2012
Сообщений: 1,517
23.08.2014, 14:59  [ТС]     Поиск макроса, принимающего строку как параметр #16
Цитата Сообщение от 0x10 Посмотреть сообщение
В контексте решаемой задачи
В рантайме проверить существование макроса, взять название макроса в виде строки(далее эту строку сунуть в combobox), взять его значение.

Boost? Библиотека какая то... Пойду качать чтоб попробовать, а то не находит путь к boost) Хотя не хотелось бы использовать сторонние библиотеки, по возможности
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
23.08.2014, 15:01     Поиск макроса, принимающего строку как параметр #17
Цитата Сообщение от Izual Посмотреть сообщение
В рантайме проверить существование макроса
Ок, меня не поняли.
Сам по себе этот набор действий не имеет смысла. Неоднократно сказал почему. Какой функционал требуется реализовать?
Izual
 Аватар для Izual
93 / 118 / 6
Регистрация: 13.11.2012
Сообщений: 1,517
23.08.2014, 15:06  [ТС]     Поиск макроса, принимающего строку как параметр #18
Цитата Сообщение от 0x10 Посмотреть сообщение
Какой функционал требуется реализовать?
Цитата Сообщение от Izual Посмотреть сообщение
В рантайме проверить существование макроса, взять название макроса в виде строки(далее эту строку сунуть в combobox), взять его значение.
Какой смысл мне повторять одно и тоже?
Я услышал что макрос для поиска "identifer name" работать не будет в рантайме, но задача от этого не изменилась.
Цитата Сообщение от 0x10 Посмотреть сообщение
Сам по себе этот набор действий не имеет смысла
Это для вас может не имеет, видимо потому что вы не понимаете что я хочу проверить макросы, взять название, взять значение и работать с ними, только в строковом виде.
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
23.08.2014, 15:08     Поиск макроса, принимающего строку как параметр #19
Цитата Сообщение от Izual Посмотреть сообщение
Это для вас может не имеет, видимо потому что вы не понимаете что я хочу проверить макросы, взять название, взять значение и работать с ними, только в строковом виде.
Это я понимаю. Я спрашиваю другое. И уже не знаю как переформулироавть вопрос, чтобы меня услышали.

То, что Вы пишете - это решение. Решение, почти наверняка, неправильное уже в своем подходе. При этом сама проблема сформулирована не была.
Иначе говоря, мой вопрос: для чего это все?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.08.2014, 15:19     Поиск макроса, принимающего строку как параметр
Еще ссылки по теме:

C++ Написать функцию atoi(), которая принимает параметр - строку цифр и возвращает соответствующее ей целое
Как отменить действие макроса UNICODE? C++
Указание текстового файла-источника и принимающего файла в cmd C++

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

Или воспользуйтесь поиском по форуму:
Izual
 Аватар для Izual
93 / 118 / 6
Регистрация: 13.11.2012
Сообщений: 1,517
23.08.2014, 15:19  [ТС]     Поиск макроса, принимающего строку как параметр #20
Цитата Сообщение от 0x10 Посмотреть сообщение
для чего это все?
Гы))
В combobox, с возможностью check, поместить названия макросов, выберя нужные ссумировать их значения в одно DWORD, как это делает функция CreateWindow например, далее вызвать функцию CreateWindow. Всё это в рантайме.
Хочу переделать вот это:
C++
1
 window[i].style = WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON;
Т.е. если я создам массив DWORD, и в ходе программы создам окно, выбрав нужные стили вызову функцию создания окна. С массивом у меня получилось, но он статический, и в виде DWORD, а я хотел бы из файла прочесть в виде char*.
Yandex
Объявления
23.08.2014, 15:19     Поиск макроса, принимающего строку как параметр
Ответ Создать тему
Опции темы

Текущее время: 08:33. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru