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

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

Войти
Регистрация
Восстановить пароль
 
 
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,537
#1

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

23.08.2014, 04:55. Просмотров 925. Ответов 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;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
КОП
348 / 280 / 86
Регистрация: 15.08.2010
Сообщений: 762
23.08.2014, 05:46     Поиск макроса, принимающего строку как параметр #2
Не совсем понимаю, зачем нужна именно строка? Может можно иначе будет реализовать.
Ну или подождем, пока гуру проснутся.
Toshkarik
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
23.08.2014, 05:47     Поиск макроса, принимающего строку как параметр #3
Можно узнать - а какой смысл передавать строку?
castaway
Эксперт С++
4876 / 3015 / 370
Регистрация: 10.11.2010
Сообщений: 11,075
Записей в блоге: 10
Завершенные тесты: 1
23.08.2014, 13:06     Поиск макроса, принимающего строку как параметр #4
По-моему эта конструкция вообще не работает, т.к. strcmp всегда сравнивает две одинаковые строки.
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,537
23.08.2014, 13:52  [ТС]     Поиск макроса, принимающего строку как параметр #5
castaway, конструкция работает. Если ввести макрос, который не существует, то метод вернёт "Not defined". Я поэтому и два раза вызов написал, с существующим макросом и не существующим.

Ну вот мне нужна строка... Почему - потому что нужна строка, извините, по другому не объясню.
0x10
2456 / 1628 / 238
Регистрация: 24.11.2012
Сообщений: 4,003
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
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,537
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
2456 / 1628 / 238
Регистрация: 24.11.2012
Сообщений: 4,003
23.08.2014, 14:18     Поиск макроса, принимающего строку как параметр #8
Цитата Сообщение от Izual Посмотреть сообщение
проверить, существует ли макрос
Буквально там написано следующее: "Сравнить значение Х с его именем". Причем если Х - это макрос, то будет подставлено его значение. Если значение макроса совпадает с его именем, то в результате наивной проверки считается, что макрос якобы не определен, что и показывает мой пример выше.
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,537
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
2456 / 1628 / 238
Регистрация: 24.11.2012
Сообщений: 4,003
23.08.2014, 14:27     Поиск макроса, принимающего строку как параметр #10
Цитата Сообщение от Izual Посмотреть сообщение
Однако я хочу из файла прочитать
Про проверки на этапе выполнения я уже выше сказал.
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,537
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
2456 / 1628 / 238
Регистрация: 24.11.2012
Сообщений: 4,003
23.08.2014, 14:40     Поиск макроса, принимающего строку как параметр #12
Цитата Сообщение от Izual Посмотреть сообщение
Да я слышал, но это противоречит тому что даже в изначальном варианте программа работает.
Лучше один раз посмотрите что происходит с кодом после подстановки, станет все ясно.

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

Макросы - этап препроцессинга. Не могут они понимать рантайм.
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,537
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
2456 / 1628 / 238
Регистрация: 24.11.2012
Сообщений: 4,003
23.08.2014, 14:49     Поиск макроса, принимающего строку как параметр #14
Цитата Сообщение от Izual Посмотреть сообщение
Не находит..
Еще раз - смотрим на исходник после препроцессинга и достигаем просветления.

Цитата Сообщение от Izual Посмотреть сообщение
А есть какой то другой вариант как в рантайме сделать то что я хочу?
А теперь вопрос: чего хотите-то? В контексте решаемой задачи, а не на уровне С++.
Voivoid
672 / 275 / 12
Регистрация: 31.03.2013
Сообщений: 1,339
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
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,537
23.08.2014, 14:59  [ТС]     Поиск макроса, принимающего строку как параметр #16
Цитата Сообщение от 0x10 Посмотреть сообщение
В контексте решаемой задачи
В рантайме проверить существование макроса, взять название макроса в виде строки(далее эту строку сунуть в combobox), взять его значение.

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

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

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

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

Или воспользуйтесь поиском по форуму:
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,537
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     Поиск макроса, принимающего строку как параметр
Ответ Создать тему
Опции темы

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