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

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

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

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

23.08.2014, 04:55. Просмотров 976. Ответов 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;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.08.2014, 04:55
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Поиск макроса, принимающего строку как параметр (C++):

Принять в параметр функции строку и вернуть ее же,но измененную - C++
Здравствуйте!Такая проблема:есть функция,принимающая в качестве аргумента строку и,проведя некоторые действия с ней,возвращает ее же,но...

Написать функцию atoi(), которая принимает параметр - строку цифр и возвращает соответствующее ей целое - C++
Это оказалось мне не по-силам, поэтому прошу помощи,господа:) Напишите функцию atoi(), которая имеет параметр - строку цифр и...

Мне надо сделать поиск последнего вхождения подстроки s1 в строку s(с функцией LastPos, не strstr). В этом коде просто вхождение подстроки в строку. - C++
#include &lt;stdio.h&gt; int count_of_substrings(string s, string s1){ int start = 0; int count = 0; int pos = 0; ...

Указание текстового файла-источника и принимающего файла в cmd - C++
Подскажите, как сделать что б при вводе через cmd надо было указывать файл-исходник и принимающий файл? &quot;полный путь\fdsfsd.exe in.txt...

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,551
23.08.2014, 14:59  [ТС] #16
Цитата Сообщение от 0x10 Посмотреть сообщение
В контексте решаемой задачи
В рантайме проверить существование макроса, взять название макроса в виде строки(далее эту строку сунуть в combobox), взять его значение.

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

То, что Вы пишете - это решение. Решение, почти наверняка, неправильное уже в своем подходе. При этом сама проблема сформулирована не была.
Иначе говоря, мой вопрос: для чего это все?
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,551
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*.
0x10
2460 / 1632 / 238
Регистрация: 24.11.2012
Сообщений: 4,015
23.08.2014, 15:22 #21
Значит, создаем ассоциативный контейнер, где ключом будет строка - имя макроса, а значением - собственно, его значение типа DWORD: map<std::string, DWORD>.
Заполняем полностью где-нибудь в коде. В интерфейс выводим строки, по выбранным элементам получаем значения. Если удобнее обращаться не по именам, а по индексам - заводим массив структур, где в элементе структуры - имя и значение.
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,551
23.08.2014, 15:27  [ТС] #22
0x10, а без всяких map и т.п. никак? (по проще как то хочется, без эвереста^^)
0x10
2460 / 1632 / 238
Регистрация: 24.11.2012
Сообщений: 4,015
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;
}
КОП
361 / 280 / 86
Регистрация: 15.08.2010
Сообщений: 762
23.08.2014, 15:31 #24
Цитата Сообщение от Izual Посмотреть сообщение
а без всяких map и т.п. никак?
такие штуки реально сильно упрощают задачу, а освоить их займет очень немного времени. В любом случае, свой контейнер реализовывать не многим быстрее, но каждый раз заново, а тут уже готовенькое и отлаженное.
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,551
23.08.2014, 15:33  [ТС] #25
Цитата Сообщение от 0x10 Посмотреть сообщение
куда уж проще?
без векторов, без STL, без boost, без классов. Что то очень простое, как был тот дефайн.(что то приближенное к Си)

Ууу, я только заметил, что вы на каждый макрос пишите его название статическим способом:
Цитата Сообщение от 0x10 Посмотреть сообщение
std::vector<Props> props = { {"A", A}, {"B", B}, {"C", C}
Таким же макаром и я могу без векторов сделать, но исходя из того что макросов в WinApi туча, то это не вариант.
0x10
2460 / 1632 / 238
Регистрация: 24.11.2012
Сообщений: 4,015
23.08.2014, 15:34 #26
Цитата Сообщение от Izual Посмотреть сообщение
без векторов
Вектор заменяется на массив.
Цитата Сообщение от Izual Посмотреть сообщение
без boost, без классов
Этого в моем примере нет.
Alex5
1052 / 715 / 105
Регистрация: 12.04.2010
Сообщений: 1,810
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
674 / 277 / 12
Регистрация: 31.03.2013
Сообщений: 1,339
23.08.2014, 15:39 #28
Цитата Сообщение от Izual Посмотреть сообщение
а без всяких map и т.п. никак? (по проще как то хочется, без эвереста^^)
Поразительная логика: использовать готовые решения - сложно, писать свои велосипеды - легко
КОП
361 / 280 / 86
Регистрация: 15.08.2010
Сообщений: 762
23.08.2014, 15:40 #29
Цитата Сообщение от Izual Посмотреть сообщение
П.С. Честно говоря я тоже не понимаю как сделан данный метод, а именно почему STR(x) и #x не эквивалентны в случае если нашло.
Добавлю чисто для информации пару особенностей макросов:
!!Во время группировки аргументов раскрытие макросов в них не выполняется.
!!Если в замещающей последовательности перед параметром не стоит знак #, если и ни перед ним, ни после него нет знака ##, то лексемы аргумента проверяются на наличие в них макровызовов; если таковые есть, то до подстановки аргумента в нем выполняется раскрытие соответствующих макросов.

Это в вики в статье про препроцессор Сишки есть. Рекомендую к ознакомлению.
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,551
23.08.2014, 15:48  [ТС] #30
Цитата Сообщение от Voivoid Посмотреть сообщение
использовать готовые решения
Я вам на это вот такую фразу дам "Что толку весь мир преобрести, а душу свою безсмертную потерять". Аналогию проведите. Вся проблема в том что я считаю что map, vector, stl, class - всё это настолько усложняет код, что потом чтобы прочесть код, надо тремя потами истечь - "овчинка выделки не стоит", я лучше стандартными Си методами буду пользоваться, они понятны и приятны.
Цитата Сообщение от КОП Посмотреть сообщение
в статье про препроцессор
Читал частично, но искал другое, потому наверно и не обратил внимание.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.08.2014, 15:48
Привет! Вот еще темы с ответами:

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

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

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

Как передать в функцию параметр (например, строку) по ссылке? - Delphi
Как пепредать в функцию параметр по ссылке, например, строку??? Спасибо.


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
23.08.2014, 15:48
Ответ Создать тему
Опции темы

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