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

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

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

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
0x10
2460 / 1632 / 238
Регистрация: 24.11.2012
Сообщений: 4,015
23.08.2014, 15:51 #31
В общем, так. Решение предложено. Какие инструменты выбрать для его реализации - за автором. А холиварить и убеждать в своей правоте можно бесконечно долго.
КОП
361 / 280 / 86
Регистрация: 15.08.2010
Сообщений: 762
23.08.2014, 15:56 #32
Цитата Сообщение от Izual Посмотреть сообщение
всё это настолько усложняет код
Подозреваю, что для многих это лишь облегчает код. Сколько людей, столько и мнений. Если ваш проект никто не будет потом разбирать, то делать велосипеды, а то и колеса изобретать, даже полезно бывает. Делайте как вам удобно. Но в основном понятными другим являются как раз таки они, а не самодельные велосипеды.

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

Добавлено через 3 минуты
Цитата Сообщение от КОП Посмотреть сообщение
ваш проект никто не будет потом разбирать
Я сам его буду разбирать, и не хочу чтоб меня стошнило. Простота - это то от чего я не хочу уходить.
Цитата Сообщение от КОП Посмотреть сообщение
Клаву в руки и вперед!
Если нет карты, то и капать нет смысла, т.к. не знаеш где, а С++ как планета, настолько большой, что без карты или компаса не возможно.
Alex5
1052 / 715 / 105
Регистрация: 12.04.2010
Сообщений: 1,810
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] - его числовое значение.
КОП
361 / 280 / 86
Регистрация: 15.08.2010
Сообщений: 762
23.08.2014, 16:03 #35
Цитата Сообщение от Izual Посмотреть сообщение
Смешно, ну опишите в матрице(2х) 10000 макросов DWORD и 10000 их названий, я и посмотрю как вы скажете про "найденное решение".
Ну они же как-то описаны в исходниках. напишите парсер самих исходников, который вытащит их в отдельный файл и используйте его.
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,551
23.08.2014, 16:10  [ТС] #36
Alex5, можно, но это копипаста файла winuser.h. Я потому и создал тему чтоб обойти копипасту, лучше было бы иметь одинарный массив, тем более что к каждой функции свои макросы к выбору представляются...

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

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

Хорошо, парсер, тогда можно ли файл, скажем, winuser.h вытащить из библиотеки и открыть через fopen? (не хочется копировать файл)
0x10
2460 / 1632 / 238
Регистрация: 24.11.2012
Сообщений: 4,015
23.08.2014, 16:16 #39
Цитата Сообщение от Izual Посмотреть сообщение
можно ли файл, скажем, winuser.h вытащить из библиотеки
В откомпилированой сборке нет макросов.
КОП
361 / 280 / 86
Регистрация: 15.08.2010
Сообщений: 762
23.08.2014, 16:16 #40
Цитата Сообщение от Izual Посмотреть сообщение
Угу, в компании Microsoft тысячи сотрудников))
Ну вы же замахнулись на переопределение их всех) Да и что же за программа, в которой юзеру можно динамически использовать 10000 параметров?

В общем либо парсер, либо по кусочкам в ручную, по мере реализации функционала. Больше вариантов тут пока нет. В голову ничего тоже не лезет.
Alex5
1052 / 715 / 105
Регистрация: 12.04.2010
Сообщений: 1,810
23.08.2014, 16:40 #41
Цитата Сообщение от Izual Посмотреть сообщение
Alex5, можно, но это копипаста файла winuser.h
Izual, "прочитать и записать" - я имею в виду

C++
1
2
3
4
5
6
7
8
9
  ifstream f( "winuser_copy.h" ); // чтобы случайно не испортить winuser.h используем его копию 
  while( ... )
  {
      f.getline(...);
      // ... 
      value[i] = ...;
      strcpy( name[i], ... );
  }
  f.close();
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,551
23.08.2014, 16:45  [ТС] #42
Alex5, так а вытащить его (этот файл-хедер winuser.h) из библиотеки user32.lib/dll можно? Т.е. имею ввиду что на компах где нет C++, там и нет хедеров, только дллки в system32.
КОП
361 / 280 / 86
Регистрация: 15.08.2010
Сообщений: 762
23.08.2014, 17:00 #43
Izual, названия макросов вам из скомпилированного файла никак не вытащить, это сродни вытащить оттуда комментарии разработчиков. Поищите в сети заголовочные файлы, наверняка там они отдельно есть.
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,551
23.08.2014, 17:04  [ТС] #44
КОП, да у меня то есть все хедеры, и в составе VS и в MinGw, только предложенный вариант предпологает тоскать с собой все эти хедеры вместе с откомпилированным exe файлом программы которую делаю.
Поясню, я хочу вытащить не названия макросов, а весь файл .h если это возможно вообще.
Alex5
1052 / 715 / 105
Регистрация: 12.04.2010
Сообщений: 1,810
23.08.2014, 17:11 #45
Цитата Сообщение от Izual Посмотреть сообщение
у меня то есть все хедеры
Цитата Сообщение от Alex5 Посмотреть сообщение
while( ... )
{
f.getline(...);
// ...
value[i] = ...;
strcpy( name[i], ... );
}
Теперь можно создать текстовый файл
C++
1
2
3
4
5
6
for( i ... )
{
  напечатаем  левую{  и кавычку 
  напечатаем  name[i] и запятую (и ещё одну кавычку)
  напечатаем  value[i] правую{  и запятую (и для наглядности конец строки)
}
Получим файл
C++
1
2
3
4
{ "WS_OVERLAPPED", 0x00000000L }, 
{ "WS_POPUP", 0x80000000L }, 
{ "WS_CHILD", 0x40000000L }, 
{ "WS_WS_MINIMIZE", 0x20000000L },
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.08.2014, 17:11
Привет! Вот еще темы с ответами:

Как в функцию передать параметр строку? - 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, 17:11
Ответ Создать тему
Опции темы

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