0 / 0 / 0
Регистрация: 11.02.2013
Сообщений: 10
|
||||||||||||||||
1 | ||||||||||||||||
Использование строк в макросах С++11.02.2013, 13:19. Показов 8812. Ответов 23
Метки нет (Все метки)
Доброго времени суток всем!
Возникла небольшая проблема - не могу понять, возможно ли сделать нечто подобное, и, если возможно, то как. Есть макрос, объявляющий функцию:
Собственно, вопрос - как это сделать правильно? В текущем варианте нет никакой реакции на вызов функции testDeclare_func(). P.S. В следующем варианте
0
|
11.02.2013, 13:19 | |
Ответы с готовыми решениями:
23
Использование строк.Использование структур Метки в макросах в ассемблерной вставке Использование строк Использование файлов и строк |
Модератор
3386 / 2158 / 352
Регистрация: 13.01.2012
Сообщений: 8,378
|
|
11.02.2013, 14:09 | 2 |
вы пытаетесь макросом объявить функцию и в то же время пытаетесь передать ей список аргументов. аргументы передаются во время вызова. наверное нужен макрос для вызова
0
|
0 / 0 / 0
Регистрация: 11.02.2013
Сообщений: 10
|
|||||||||||
11.02.2013, 15:28 [ТС] | 3 | ||||||||||
Какого рода макрос?
Если объявить функцию следующим макросом
Или я неправильно понял смысл поста?
0
|
Модератор
3386 / 2158 / 352
Регистрация: 13.01.2012
Сообщений: 8,378
|
|||||||||||
11.02.2013, 15:39 | 4 | ||||||||||
вот во что будет преобразован макрос
__VA_ARGS__ можно было бы скормить вызову функции но не определению то есть
0
|
0 / 0 / 0
Регистрация: 11.02.2013
Сообщений: 10
|
||||||||||||||||
11.02.2013, 21:45 [ТС] | 5 | |||||||||||||||
Пардон, торопился, ошибся, когда в уме модифицировал.
Переделывал из рабочего макроса
Реальный код таков:
Вот проблема в том, как обработать body. P.S. Код рабочий, за исключением того, что не в курсе, как строку преобразовать в тело функции. Если подставить туда a1(ну или любые другие аргументы) + написать тело вручную, то все будет работать отлично. К примеру, аналогичный макрос предназначен для универсального парса lua_State перехваченных функций в 1 игрушке, использующей луа-движок.
0
|
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
|
||||||
11.02.2013, 22:14 | 6 | |||||
demogor, вы забываетесь. C/C++ - это компилируемые языки. Т.е. перед запуском куска кода - он должен быть скомпилирован! Т.е. невозможно выполнить в программе код, который помещен в текстовую строку. Это возможно в большинстве скриптовых языков, таких как Python, но никак не C++.
А при компиляции, компилятор возьмет строку RF_IMP(void, __cdecl, declare,testDeclare,void); затем преобразует ее в DECLARE_FUNC(testDeclare,declare,__cdecl, void); затем это преобразует в __declspec(dllexport) void type_cl testDeclare_func( void ){ debug_msg("TestDeclare","hello!"); declare; } А затем полученный код он будет дальше компилировать. Т.е. как видно, вместо body подставиться просто строка теста, то никак не тело функции, которое вы хотите сделать. Добавлено через 4 минуты Стоит запомнить, что макросы никаким образом не работают с содержимым перменных, только с именами. Например
1
|
0 / 0 / 0
Регистрация: 11.02.2013
Сообщений: 10
|
|
11.02.2013, 22:17 [ТС] | 7 |
Понял, собственно это меня и интересовало, благодарю за ответ)
А есть ли возможность импорта тела функции из lua? Можно импортировать всю функцию, конечно, но это не самый идеальный вариант.
0
|
11.02.2013, 22:29 | 9 |
Я не очень понимаю смысла фразы "импорта тела функции из lua". Если ты хочешь исполнить код Lua из-под Си/Си++, то можешь тут посмотреть: https://www.cyberforum.ru/cpp-... 68085.html. В посте #8 конкретный пример (который никак не зависит от конкретного компилятора)
0
|
0 / 0 / 0
Регистрация: 11.02.2013
Сообщений: 10
|
|
11.02.2013, 22:54 [ТС] | 10 |
Да не, как импортировать функции туда-обратно, я представляю. Хотел реализовать просто обертку для перехвата функций(много достаточно однотипных функций, объявлять их уже наловчился, было бы неплохо добавить возможность изменять код извне, что бы каждый раз не ребилдить dll'ку).
0
|
0 / 0 / 0
Регистрация: 11.02.2013
Сообщений: 10
|
||||||
12.02.2013, 00:24 [ТС] | 12 | |||||
Неточно выразился.
Я имел в виду макросы для объявления функций, используемых для перехвата оригинальных функций.
Функции объявил, рассчитал адрес в памяти(если он не статический), поставил хук - и нужно бы описать функции, но пока это приходится делать вручную. Правда, можно обойтись и простым логированием, для начала вполне сойдет.
0
|
12.02.2013, 09:02 | 13 | ||||||||||
Из этого тебе надо родить макрос RF_O? А что за константа в 4-м параметре? Есть такая умная мысль: "грамотно поставленный вопрос - это уже половина ответа". Я примерно понимаю, что тебе надо, но не пойму, что же конкретно
В самом первом посте во втором фрагменте кода во втором параметре нужно было просто убрать кавычки. И вместо того, чтобы гадать, что же получается, возьми да посмотри текст, который получается после препроцессора Код
Добавлено через 1 минуту Может вот это тебе чем-то поможет: https://www.cyberforum.ru/blogs/18334/blog100.html
0
|
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
|
|
12.02.2013, 10:07 | 14 |
Evg, как я понял, у него есть библиотееа на C++. Но ее нужно очень часто менять, но ему очень не хочется постоянно ее перекомпилировать для этого. Поэтому он хочет, чтобы внутри его библиотеки использовались функции из скриптового языка. Т. е. можно поменять что-то в библиотеке просто изменив функции в скрипте.
0
|
Kastaneda
|
|||||
12.02.2013, 10:18
#15
|
|||||
Не по теме: Видел пример использования подобных вещей в одном из рабочих проектов. Кликните здесь для просмотра всего текста
1
|
Модератор
3386 / 2158 / 352
Регистрация: 13.01.2012
Сообщений: 8,378
|
|
12.02.2013, 10:46 | 16 |
я думал что препроцессор споткнется об запятую перед hello, но пример работает. как это возможно?
1
|
12.02.2013, 22:05 | 17 |
Ну... при такой постановке вопроса в компилируемых языках настолько просто это не решается.
Слушай, хороший вопрос. Мне казалось чем-то самим собой разумеющимся то, что наличие скобок экранирует запятые. Причём наверняка оно так и есть, но я как-то никогда об этом не задумывался, просто использовал и всё. Надо бы почитать
0
|
0 / 0 / 0
Регистрация: 11.02.2013
Сообщений: 10
|
|
12.02.2013, 22:29 [ТС] | 18 |
Evg, если о lua_State(
Вариант подачи тела, предоставленный выше, логичен, но хотелось именно строку передавать, что бы была возможность вытягивать тело функции из отдельного файла(nonedark абсолютно прав). Необходимость этого в том, что я разбираю потихоньку клиент и для получения информации о функциях их необходимо перехватывать. Каждый раз, что бы это сделать, необходимо описывать функции - а это не слишком удобно. Именно для этого и нужны макросы, потому и хочу максимально автоматизировать процесс. Более того, в принципе, для начала меня вполне устроит макрос, который будет объявлять и описывать функцию с выводом аргументов в файл при перехвате.
0
|
12.02.2013, 22:39 | 19 |
Для компилируемого языка сие попросту нормально не реализуемо. Единственный способ - это из программы сгенерить файл на Си, далее из программы же вызвать компилятор и сформировать динамическую библиотеку, далее из программы же эту библиотеку подключить (в unix-системах есть интерфейс dlopen и ко, наверняка в винде есть то же самое). Либо использовать всякие нанотехнологии типа OpenCL, которые по большому счёту точно так же являются вызовом компилятора, только всё это монолитно встраивается в программу.
Генерация исходника на ходу, как уже говорилось, характерна для всяких скриптовых языков, но не для компилируемых. Потому как при работе скриптового языка всегда есть интерпретатор, который всё может, а компилируемые языки характеризуются тем, что при исполнении программы компилятор уже не нужен Добавлено через 1 минуту А в целом я твою задачу всё равно не понимаю из-за невнятной постановки Ну или могу порекомендовать на ходу генерировать функции на Lua, а не на Си. Интерпретатор Lua встраивается в программу, а потому сие вполне допустимо
0
|
0 / 0 / 0
Регистрация: 11.02.2013
Сообщений: 10
|
|
12.02.2013, 22:49 [ТС] | 20 |
Я хочу добавлять хуки сразу из луа, но для этого нужно как-то описывать тело функции(а не только ее декларировать). Вариант с подачей из текстового файла сначала показался самым подходящим но, как я уже понял, это не представляется возможным.
Впрочем, думаю, мне вполне хватит варианта с выводом аргументов.
0
|
12.02.2013, 22:49 | |
12.02.2013, 22:49 | |
Помогаю со студенческими работами здесь
20
Использование строк и файлов Использование одномерного массива строк Использование строк(как правильно?) Использование собственного класса строк Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |