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

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

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

Author24 — интернет-сервис помощи студентам
Можно ли данный пример переделать, только чтоб в макрос входила строка, т.е. так: 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.08.2014, 04:55
Ответы с готовыми решениями:

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

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

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

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

45
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
23.08.2014, 15:22 21
Author24 — интернет-сервис помощи студентам
Значит, создаем ассоциативный контейнер, где ключом будет строка - имя макроса, а значением - собственно, его значение типа DWORD: map<std::string, DWORD>.
Заполняем полностью где-нибудь в коде. В интерфейс выводим строки, по выбранным элементам получаем значения. Если удобнее обращаться не по именам, а по индексам - заводим массив структур, где в элементе структуры - имя и значение.
0
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
23.08.2014, 15:27  [ТС] 22
0x10, а без всяких map и т.п. никак? (по проще как то хочется, без эвереста^^)
0
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
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;
}
0
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
23.08.2014, 15:31 24
Цитата Сообщение от Izual Посмотреть сообщение
а без всяких map и т.п. никак?
такие штуки реально сильно упрощают задачу, а освоить их займет очень немного времени. В любом случае, свой контейнер реализовывать не многим быстрее, но каждый раз заново, а тут уже готовенькое и отлаженное.
0
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
23.08.2014, 15:33  [ТС] 25
Цитата Сообщение от 0x10 Посмотреть сообщение
куда уж проще?
без векторов, без STL, без boost, без классов. Что то очень простое, как был тот дефайн.(что то приближенное к Си)

Ууу, я только заметил, что вы на каждый макрос пишите его название статическим способом:
Цитата Сообщение от 0x10 Посмотреть сообщение
std::vector<Props> props = { {"A", A}, {"B", B}, {"C", C}
Таким же макаром и я могу без векторов сделать, но исходя из того что макросов в WinApi туча, то это не вариант.
0
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
23.08.2014, 15:34 26
Цитата Сообщение от Izual Посмотреть сообщение
без векторов
Вектор заменяется на массив.
Цитата Сообщение от Izual Посмотреть сообщение
без boost, без классов
Этого в моем примере нет.
0
1130 / 789 / 232
Регистрация: 12.04.2010
Сообщений: 2,012
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")
0
710 / 283 / 16
Регистрация: 31.03.2013
Сообщений: 1,340
23.08.2014, 15:39 28
Цитата Сообщение от Izual Посмотреть сообщение
а без всяких map и т.п. никак? (по проще как то хочется, без эвереста^^)
Поразительная логика: использовать готовые решения - сложно, писать свои велосипеды - легко
0
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
23.08.2014, 15:40 29
Цитата Сообщение от Izual Посмотреть сообщение
П.С. Честно говоря я тоже не понимаю как сделан данный метод, а именно почему STR(x) и #x не эквивалентны в случае если нашло.
Добавлю чисто для информации пару особенностей макросов:
!!Во время группировки аргументов раскрытие макросов в них не выполняется.
!!Если в замещающей последовательности перед параметром не стоит знак #, если и ни перед ним, ни после него нет знака ##, то лексемы аргумента проверяются на наличие в них макровызовов; если таковые есть, то до подстановки аргумента в нем выполняется раскрытие соответствующих макросов.

Это в вики в статье про препроцессор Сишки есть. Рекомендую к ознакомлению.
0
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
23.08.2014, 15:48  [ТС] 30
Цитата Сообщение от Voivoid Посмотреть сообщение
использовать готовые решения
Я вам на это вот такую фразу дам "Что толку весь мир преобрести, а душу свою безсмертную потерять". Аналогию проведите. Вся проблема в том что я считаю что map, vector, stl, class - всё это настолько усложняет код, что потом чтобы прочесть код, надо тремя потами истечь - "овчинка выделки не стоит", я лучше стандартными Си методами буду пользоваться, они понятны и приятны.
Цитата Сообщение от КОП Посмотреть сообщение
в статье про препроцессор
Читал частично, но искал другое, потому наверно и не обратил внимание.
0
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
23.08.2014, 15:51 31
В общем, так. Решение предложено. Какие инструменты выбрать для его реализации - за автором. А холиварить и убеждать в своей правоте можно бесконечно долго.
0
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
23.08.2014, 15:56 32
Цитата Сообщение от Izual Посмотреть сообщение
всё это настолько усложняет код
Подозреваю, что для многих это лишь облегчает код. Сколько людей, столько и мнений. Если ваш проект никто не будет потом разбирать, то делать велосипеды, а то и колеса изобретать, даже полезно бывает. Делайте как вам удобно. Но в основном понятными другим являются как раз таки они, а не самодельные велосипеды.

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

Добавлено через 3 минуты
Цитата Сообщение от КОП Посмотреть сообщение
ваш проект никто не будет потом разбирать
Я сам его буду разбирать, и не хочу чтоб меня стошнило. Простота - это то от чего я не хочу уходить.
Цитата Сообщение от КОП Посмотреть сообщение
Клаву в руки и вперед!
Если нет карты, то и капать нет смысла, т.к. не знаеш где, а С++ как планета, настолько большой, что без карты или компаса не возможно.
0
1130 / 789 / 232
Регистрация: 12.04.2010
Сообщений: 2,012
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] - его числовое значение.
0
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
23.08.2014, 16:03 35
Цитата Сообщение от Izual Посмотреть сообщение
Смешно, ну опишите в матрице(2х) 10000 макросов DWORD и 10000 их названий, я и посмотрю как вы скажете про "найденное решение".
Ну они же как-то описаны в исходниках. напишите парсер самих исходников, который вытащит их в отдельный файл и используйте его.
0
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
23.08.2014, 16:10  [ТС] 36
Alex5, можно, но это копипаста файла winuser.h. Я потому и создал тему чтоб обойти копипасту, лучше было бы иметь одинарный массив, тем более что к каждой функции свои макросы к выбору представляются...

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

Добавлено через 1 минуту
Цитата Сообщение от КОП Посмотреть сообщение
описаны в исходниках
Угу, в компании Microsoft тысячи сотрудников))
0
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
23.08.2014, 16:11 37
Цитата Сообщение от Izual Посмотреть сообщение
Смешно, ну опишите в матрице(2х) 10000 макросов DWORD и 10000 их названий, я и посмотрю как вы скажете про "найденное решение".
Пока я о нем могу сказать одно - оно работает и тем самым лучше вообще нереализуемого.
Как уже сказали выше, такой исходник можно и сгенерить. Даже не умным парсером, а банальным grep + sed/awk или редактором с курсорами в нескольких строках. Но прежде чем браться за автоматизацию, вопрос: а в рассматриваемом случае их сколько? Десяток, два? Если так, то оно не стоит и попыток автоматизации. Иначе - см выше, автоматизируется легко.
0
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
23.08.2014, 16:15  [ТС] 38
Цитата Сообщение от 0x10 Посмотреть сообщение
в рассматриваемом случае их сколько?
Их столько, сколько подключается файлов и функций через user32.dll, kernel32.dll и др. стандартные библиотеки. Думаю что больше 10000.

Хорошо, парсер, тогда можно ли файл, скажем, winuser.h вытащить из библиотеки и открыть через fopen? (не хочется копировать файл)
0
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
23.08.2014, 16:16 39
Цитата Сообщение от Izual Посмотреть сообщение
можно ли файл, скажем, winuser.h вытащить из библиотеки
В откомпилированой сборке нет макросов.
0
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
23.08.2014, 16:16 40
Цитата Сообщение от Izual Посмотреть сообщение
Угу, в компании Microsoft тысячи сотрудников))
Ну вы же замахнулись на переопределение их всех) Да и что же за программа, в которой юзеру можно динамически использовать 10000 параметров?

В общем либо парсер, либо по кусочкам в ручную, по мере реализации функционала. Больше вариантов тут пока нет. В голову ничего тоже не лезет.
0
23.08.2014, 16:16
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.08.2014, 16:16
Помогаю со студенческими работами здесь

Можно ли передать строку, как параметр?
пример обработчик события, хочу в нем кроме параметров (чисел), передать строку...

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

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

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


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

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