Форум программистов, компьютерный форум 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++ Как передать элемент структуры, как параметр функции
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
23.08.2014, 15:22     Поиск макроса, принимающего строку как параметр #21
Значит, создаем ассоциативный контейнер, где ключом будет строка - имя макроса, а значением - собственно, его значение типа DWORD: map<std::string, DWORD>.
Заполняем полностью где-нибудь в коде. В интерфейс выводим строки, по выбранным элементам получаем значения. Если удобнее обращаться не по именам, а по индексам - заводим массив структур, где в элементе структуры - имя и значение.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Izual
 Аватар для Izual
93 / 118 / 6
Регистрация: 13.11.2012
Сообщений: 1,517
23.08.2014, 15:27  [ТС]     Поиск макроса, принимающего строку как параметр #22
0x10, а без всяких map и т.п. никак? (по проще как то хочется, без эвереста^^)
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
23.08.2014, 15:30     Поиск макроса, принимающего строку как параметр #23
Izual, куда уж проще?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <iostream>
#include <string>
#include <vector>
 
struct Props {
    std::string name;
    int value;
};
 
#define A 1
#define B 2
#define C 4
 
// #define GET_PROP_PAIR(x) {#x, x}
 
int main() {
    std::vector<Props> props = {
        {"A", A},
        {"B", B},
        {"C", C}
        // Можно срезать угол и так:
        // GET_PROP_PAIR(C)
    };
    
    for (const auto& item : props) {
        // Это будет выведено в интерфейс
        std::cout << item.name << std::endl;
    }
    
    // индексы свойств, которые нужно использовать
    std::vector<int> item_idxs = {0, 2};
    int value = 0;
    for (const auto& idx : item_idxs) {
        value |= props[idx].value;
    }
    std::cout << "value: " << value << std::endl;
}
КОП
348 / 280 / 86
Регистрация: 15.08.2010
Сообщений: 755
23.08.2014, 15:31     Поиск макроса, принимающего строку как параметр #24
Цитата Сообщение от Izual Посмотреть сообщение
а без всяких map и т.п. никак?
такие штуки реально сильно упрощают задачу, а освоить их займет очень немного времени. В любом случае, свой контейнер реализовывать не многим быстрее, но каждый раз заново, а тут уже готовенькое и отлаженное.
Izual
 Аватар для Izual
93 / 118 / 6
Регистрация: 13.11.2012
Сообщений: 1,517
23.08.2014, 15:33  [ТС]     Поиск макроса, принимающего строку как параметр #25
Цитата Сообщение от 0x10 Посмотреть сообщение
куда уж проще?
без векторов, без STL, без boost, без классов. Что то очень простое, как был тот дефайн.(что то приближенное к Си)

Ууу, я только заметил, что вы на каждый макрос пишите его название статическим способом:
Цитата Сообщение от 0x10 Посмотреть сообщение
std::vector<Props> props = { {"A", A}, {"B", B}, {"C", C}
Таким же макаром и я могу без векторов сделать, но исходя из того что макросов в WinApi туча, то это не вариант.
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
23.08.2014, 15:34     Поиск макроса, принимающего строку как параметр #26
Цитата Сообщение от Izual Посмотреть сообщение
без векторов
Вектор заменяется на массив.
Цитата Сообщение от Izual Посмотреть сообщение
без boost, без классов
Этого в моем примере нет.
Alex5
883 / 618 / 81
Регистрация: 12.04.2010
Сообщений: 1,552
23.08.2014, 15:39     Поиск макроса, принимающего строку как параметр #27
Цитата Сообщение от Izual Посмотреть сообщение
как сделан данный метод, а именно почему STR(x) и #x не эквивалентны в случае если нашло.
Видимо, SHOW_DEFINE(WS_VISIBLE) преобразуется таким образом. Сначала будет подставлен WS_VISIBLE вместо x в определение SHOW_DEFINE(x)
C++
1
    strcmp(STR(WS_VISIBLE),"WS_VISIBLE")!=0?strcpy(buf,"WS_VISIBLE"):strcpy(buf,"NOT defined")
Теперь применяется макрос WS_VISIBLE (его значение 0x10000000L определено в winuser.h)
C++
1
    strcmp(STR(0x10000000L),"WS_VISIBLE")!=0?strcpy(buf,"WS_VISIBLE"):strcpy(buf,"NOT defined")
Теперь макрос STR(x). (Кстати, всё это ещё до начала компиляции.)
C++
1
2
    //   только теперь получается выражение, которое будет компилироваться 
    strcmp( "0x10000000L","WS_VISIBLE")!=0?strcpy(buf,"WS_VISIBLE"):strcpy(buf,"NOT defined")
Voivoid
 Аватар для Voivoid
580 / 256 / 12
Регистрация: 31.03.2013
Сообщений: 1,284
23.08.2014, 15:39     Поиск макроса, принимающего строку как параметр #28
Цитата Сообщение от Izual Посмотреть сообщение
а без всяких map и т.п. никак? (по проще как то хочется, без эвереста^^)
Поразительная логика: использовать готовые решения - сложно, писать свои велосипеды - легко
КОП
348 / 280 / 86
Регистрация: 15.08.2010
Сообщений: 755
23.08.2014, 15:40     Поиск макроса, принимающего строку как параметр #29
Цитата Сообщение от Izual Посмотреть сообщение
П.С. Честно говоря я тоже не понимаю как сделан данный метод, а именно почему STR(x) и #x не эквивалентны в случае если нашло.
Добавлю чисто для информации пару особенностей макросов:
!!Во время группировки аргументов раскрытие макросов в них не выполняется.
!!Если в замещающей последовательности перед параметром не стоит знак #, если и ни перед ним, ни после него нет знака ##, то лексемы аргумента проверяются на наличие в них макровызовов; если таковые есть, то до подстановки аргумента в нем выполняется раскрытие соответствующих макросов.

Это в вики в статье про препроцессор Сишки есть. Рекомендую к ознакомлению.
Izual
 Аватар для Izual
93 / 118 / 6
Регистрация: 13.11.2012
Сообщений: 1,517
23.08.2014, 15:48  [ТС]     Поиск макроса, принимающего строку как параметр #30
Цитата Сообщение от Voivoid Посмотреть сообщение
использовать готовые решения
Я вам на это вот такую фразу дам "Что толку весь мир преобрести, а душу свою безсмертную потерять". Аналогию проведите. Вся проблема в том что я считаю что map, vector, stl, class - всё это настолько усложняет код, что потом чтобы прочесть код, надо тремя потами истечь - "овчинка выделки не стоит", я лучше стандартными Си методами буду пользоваться, они понятны и приятны.
Цитата Сообщение от КОП Посмотреть сообщение
в статье про препроцессор
Читал частично, но искал другое, потому наверно и не обратил внимание.
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
23.08.2014, 15:51     Поиск макроса, принимающего строку как параметр #31
В общем, так. Решение предложено. Какие инструменты выбрать для его реализации - за автором. А холиварить и убеждать в своей правоте можно бесконечно долго.
КОП
348 / 280 / 86
Регистрация: 15.08.2010
Сообщений: 755
23.08.2014, 15:56     Поиск макроса, принимающего строку как параметр #32
Цитата Сообщение от Izual Посмотреть сообщение
всё это настолько усложняет код
Подозреваю, что для многих это лишь облегчает код. Сколько людей, столько и мнений. Если ваш проект никто не будет потом разбирать, то делать велосипеды, а то и колеса изобретать, даже полезно бывает. Делайте как вам удобно. Но в основном понятными другим являются как раз таки они, а не самодельные велосипеды.

Добавлено через 52 секунды
Цитата Сообщение от 0x10 Посмотреть сообщение
Какие инструменты выбрать для его реализации - за автором.
Поддерживаю. Клаву в руки и вперед!
Izual
 Аватар для Izual
93 / 118 / 6
Регистрация: 13.11.2012
Сообщений: 1,517
23.08.2014, 16:00  [ТС]     Поиск макроса, принимающего строку как параметр #33
Цитата Сообщение от 0x10 Посмотреть сообщение
Решение предложено.
Смешно, ну опишите в матрице(2х) 10000 макросов DWORD и 10000 их названий, я и посмотрю как вы скажете про "найденное решение".
Цитата Сообщение от 0x10 Посмотреть сообщение
А холиварить и убеждать в своей правоте
Никто ни кого не убеждает и не холиварит, если только вы сами эти эмоции не вкладываете в свои посты. Я лишь сказал те факторы, которые мною движут, и мне глубоко пофиг принимаете вы их или нет, ваша жизнь - ваши мысли.
Задача не решена, писать матрицу для 10000 макросов - не вариант.

Добавлено через 3 минуты
Цитата Сообщение от КОП Посмотреть сообщение
ваш проект никто не будет потом разбирать
Я сам его буду разбирать, и не хочу чтоб меня стошнило. Простота - это то от чего я не хочу уходить.
Цитата Сообщение от КОП Посмотреть сообщение
Клаву в руки и вперед!
Если нет карты, то и капать нет смысла, т.к. не знаеш где, а С++ как планета, настолько большой, что без карты или компаса не возможно.
Alex5
883 / 618 / 81
Регистрация: 12.04.2010
Сообщений: 1,552
23.08.2014, 16:00     Поиск макроса, принимающего строку как параметр #34
Цитата Сообщение от Izual Посмотреть сообщение
я хотел бы из файла прочесть в виде char*.
Можно создать такой файл
C++
1
2
3
4
5
6
7
8
#define WS_OVERLAPPED       0x00000000L
#define WS_POPUP            0x80000000L
#define WS_CHILD            0x40000000L
#define WS_MINIMIZE         0x20000000L
#define WS_VISIBLE          0x10000000L
#define WS_DISABLED         0x08000000L
#define WS_CLIPSIBLINGS     0x04000000L
#define WS_CLIPCHILDREN     0x02000000L
При чтении #define пропускаем, второе слово запишем в массив char name[][], число в массив long value[]. При работе программы name[i] используем, если нужно имя макроса, value[i] - его числовое значение.
КОП
348 / 280 / 86
Регистрация: 15.08.2010
Сообщений: 755
23.08.2014, 16:03     Поиск макроса, принимающего строку как параметр #35
Цитата Сообщение от Izual Посмотреть сообщение
Смешно, ну опишите в матрице(2х) 10000 макросов DWORD и 10000 их названий, я и посмотрю как вы скажете про "найденное решение".
Ну они же как-то описаны в исходниках. напишите парсер самих исходников, который вытащит их в отдельный файл и используйте его.
Izual
 Аватар для Izual
93 / 118 / 6
Регистрация: 13.11.2012
Сообщений: 1,517
23.08.2014, 16:10  [ТС]     Поиск макроса, принимающего строку как параметр #36
Alex5, можно, но это копипаста файла winuser.h. Я потому и создал тему чтоб обойти копипасту, лучше было бы иметь одинарный массив, тем более что к каждой функции свои макросы к выбору представляются...

П.С. Если задачу не решить в рантайме, то возможно есть способ прочесть winuser.h как файл?(не копируя сам файл, а загрузив например библиотеку user32.dll)

Добавлено через 1 минуту
Цитата Сообщение от КОП Посмотреть сообщение
описаны в исходниках
Угу, в компании Microsoft тысячи сотрудников))
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
23.08.2014, 16:11     Поиск макроса, принимающего строку как параметр #37
Цитата Сообщение от Izual Посмотреть сообщение
Смешно, ну опишите в матрице(2х) 10000 макросов DWORD и 10000 их названий, я и посмотрю как вы скажете про "найденное решение".
Пока я о нем могу сказать одно - оно работает и тем самым лучше вообще нереализуемого.
Как уже сказали выше, такой исходник можно и сгенерить. Даже не умным парсером, а банальным grep + sed/awk или редактором с курсорами в нескольких строках. Но прежде чем браться за автоматизацию, вопрос: а в рассматриваемом случае их сколько? Десяток, два? Если так, то оно не стоит и попыток автоматизации. Иначе - см выше, автоматизируется легко.
Izual
 Аватар для Izual
93 / 118 / 6
Регистрация: 13.11.2012
Сообщений: 1,517
23.08.2014, 16:15  [ТС]     Поиск макроса, принимающего строку как параметр #38
Цитата Сообщение от 0x10 Посмотреть сообщение
в рассматриваемом случае их сколько?
Их столько, сколько подключается файлов и функций через user32.dll, kernel32.dll и др. стандартные библиотеки. Думаю что больше 10000.

Хорошо, парсер, тогда можно ли файл, скажем, winuser.h вытащить из библиотеки и открыть через fopen? (не хочется копировать файл)
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
23.08.2014, 16:16     Поиск макроса, принимающего строку как параметр #39
Цитата Сообщение от Izual Посмотреть сообщение
можно ли файл, скажем, winuser.h вытащить из библиотеки
В откомпилированой сборке нет макросов.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.08.2014, 16:16     Поиск макроса, принимающего строку как параметр
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
КОП
348 / 280 / 86
Регистрация: 15.08.2010
Сообщений: 755
23.08.2014, 16:16     Поиск макроса, принимающего строку как параметр #40
Цитата Сообщение от Izual Посмотреть сообщение
Угу, в компании Microsoft тысячи сотрудников))
Ну вы же замахнулись на переопределение их всех) Да и что же за программа, в которой юзеру можно динамически использовать 10000 параметров?

В общем либо парсер, либо по кусочкам в ручную, по мере реализации функционала. Больше вариантов тут пока нет. В голову ничего тоже не лезет.
Yandex
Объявления
23.08.2014, 16:16     Поиск макроса, принимающего строку как параметр
Ответ Создать тему
Опции темы

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