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

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

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

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

23.08.2014, 04:55. Просмотров 1010. Ответов 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;
}
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
Доброго времени суток! У меня возникла проблема или вернее нехватка знаний непозволяет решить простую задачу :(, а времени в обрез, прошу...

45
КОП
361 / 280 / 86
Регистрация: 15.08.2010
Сообщений: 762
23.08.2014, 05:46 #2
Не совсем понимаю, зачем нужна именно строка? Может можно иначе будет реализовать.
Ну или подождем, пока гуру проснутся.
0
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,386
Завершенные тесты: 1
23.08.2014, 05:47 #3
Можно узнать - а какой смысл передавать строку?
0
castaway
Эксперт С++
4885 / 3020 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
23.08.2014, 13:06 #4
По-моему эта конструкция вообще не работает, т.к. strcmp всегда сравнивает две одинаковые строки.
0
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,552
23.08.2014, 13:52  [ТС] #5
castaway, конструкция работает. Если ввести макрос, который не существует, то метод вернёт "Not defined". Я поэтому и два раза вызов написал, с существующим макросом и не существующим.

Ну вот мне нужна строка... Почему - потому что нужна строка, извините, по другому не объясню.
0
0x10
2474 / 1647 / 247
Регистрация: 24.11.2012
Сообщений: 4,068
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 Посмотреть сообщение
Ну вот мне нужна строка... Почему - потому что нужна строка, извините, по другому не объясню.
Это не объяснение. Могу только предположить, что хочется во время выполнения программы получать информацию о макросах, которые были на момент сборки. По-простому так сделать нельзя, поскольку после препроцессинга уже выполнены все подстановки препроцессора.
0
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,552
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)
0
0x10
2474 / 1647 / 247
Регистрация: 24.11.2012
Сообщений: 4,068
23.08.2014, 14:18 #8
Цитата Сообщение от Izual Посмотреть сообщение
проверить, существует ли макрос
Буквально там написано следующее: "Сравнить значение Х с его именем". Причем если Х - это макрос, то будет подставлено его значение. Если значение макроса совпадает с его именем, то в результате наивной проверки считается, что макрос якобы не определен, что и показывает мой пример выше.
0
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,552
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) в этом случае передастся с ковычками, а надо без них...
0
0x10
2474 / 1647 / 247
Регистрация: 24.11.2012
Сообщений: 4,068
23.08.2014, 14:27 #10
Цитата Сообщение от Izual Посмотреть сообщение
Однако я хочу из файла прочитать
Про проверки на этапе выполнения я уже выше сказал.
0
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,552
23.08.2014, 14:34  [ТС] #11
Цитата Сообщение от 0x10 Посмотреть сообщение
получать информацию о макросах, которые были на момент сборки. По-простому так сделать нельзя, поскольку после препроцессинга уже выполнены все подстановки препроцессора.
Да я слышал, но это противоречит тому что даже в изначальном варианте программа работает. Я могу в ходе работы программы вызывать этот макрос и подставлять например одну из переменных массива DWORD (например если бы я написал:
C++
1
DWORD mmac[5] = {WS_VISIBLE, WS_CHILD, WS_OVERLAPPED, WS_BORDER, WS_DISABLED};
То всё бы работало, однако мне надо конвертирование сделать из char*.
0
0x10
2474 / 1647 / 247
Регистрация: 24.11.2012
Сообщений: 4,068
23.08.2014, 14:40 #12
Цитата Сообщение от Izual Посмотреть сообщение
Да я слышал, но это противоречит тому что даже в изначальном варианте программа работает.
Лучше один раз посмотрите что происходит с кодом после подстановки, станет все ясно.

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

Макросы - этап препроцессинга. Не могут они понимать рантайм.
0
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,552
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]);
Не находит..
А есть какой то другой вариант как в рантайме сделать то что я хочу?
0
0x10
2474 / 1647 / 247
Регистрация: 24.11.2012
Сообщений: 4,068
23.08.2014, 14:49 #14
Цитата Сообщение от Izual Посмотреть сообщение
Не находит..
Еще раз - смотрим на исходник после препроцессинга и достигаем просветления.

Цитата Сообщение от Izual Посмотреть сообщение
А есть какой то другой вариант как в рантайме сделать то что я хочу?
А теперь вопрос: чего хотите-то? В контексте решаемой задачи, а не на уровне С++.
0
Voivoid
675 / 278 / 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;
}
0
23.08.2014, 14:51
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.08.2014, 14:51
Привет! Вот еще темы с ответами:

Как в функцию передать параметр строку? - 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
Как пепредать в функцию параметр по ссылке, например, строку??? Спасибо.


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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