0 / 0 / 0
Регистрация: 11.02.2013
Сообщений: 10
|
||||||||||||||||
1 | ||||||||||||||||
Использование строк в макросах С++11.02.2013, 13:19. Показов 9314. Ответов 23
Метки нет (Все метки)
Доброго времени суток всем!
Возникла небольшая проблема - не могу понять, возможно ли сделать нечто подобное, и, если возможно, то как. Есть макрос, объявляющий функцию:
Собственно, вопрос - как это сделать правильно? В текущем варианте нет никакой реакции на вызов функции testDeclare_func(). P.S. В следующем варианте
0
|
11.02.2013, 13:19 | |
Ответы с готовыми решениями:
23
Использование строк.Использование структур Метки в макросах в ассемблерной вставке Использование строк Использование файлов и строк |
Модератор
3401 / 2172 / 353
Регистрация: 13.01.2012
Сообщений: 8,419
|
|
11.02.2013, 14:09 | 2 |
вы пытаетесь макросом объявить функцию и в то же время пытаетесь передать ей список аргументов. аргументы передаются во время вызова. наверное нужен макрос для вызова
0
|
0 / 0 / 0
Регистрация: 11.02.2013
Сообщений: 10
|
|||||||||||
11.02.2013, 15:28 [ТС] | 3 | ||||||||||
Какого рода макрос?
Если объявить функцию следующим макросом
Или я неправильно понял смысл поста?
0
|
Модератор
3401 / 2172 / 353
Регистрация: 13.01.2012
Сообщений: 8,419
|
|||||||||||
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
|
Модератор
3401 / 2172 / 353
Регистрация: 13.01.2012
Сообщений: 8,419
|
|
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
Использование строк и файлов Использование одномерного массива строк Использование строк(как правильно?) Использование собственного класса строк Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи | |||||
Это работает. Скорость асинхронной логики велика. Вопрос видимо останется в стабильности. Плата - огонь!
Hrethgir 13.01.2025
По прошлому проекту в Logisim Evolution https:/ / www. cyberforum. ru/ blogs/ 223907/ blog8781. html прилагаю файл архива проекта Gowin Eda и снимок. Восьмибитный счётчик из сумматора+ генератор сигнала. . .
|
UserScript для подсветки кнопок языков программирования в зависимости от текущего раздела
volvo 13.01.2025
В результате работы этого скрипта подсвечиваются нужные кнопки не только в форме быстрого ответа, но и при редактировании сообщения:
/ / ==UserScript==
/ / @name CF_DefaultLangSelect
/ / . . .
|
Введение в модели и алгоритмы машинного обучения
InfoMaster 12.01.2025
Машинное обучение представляет собой одну из наиболее динамично развивающихся областей искусственного интеллекта, которая фокусируется на разработке алгоритмов и методов, позволяющих компьютерам. . .
|
Как на Python создать нейросеть для решения задач
InfoMaster 12.01.2025
В контексте стремительного развития современных технологий особое внимание уделяется таким инструментам, как нейросети. Эти структуры, вдохновленные биологическими нейронными сетями, используются для. . .
|
Как создать нейросеть для генерации картинок на Python
InfoMaster 12.01.2025
Генерация изображений с помощью искусственных нейронных сетей стала одним из наиболее захватывающих направлений в области компьютерного зрения и машинного обучения. В этой статье мы рассмотрим. . .
|
Создание нейросети для генерации текста на Python
InfoMaster 12.01.2025
Нейросети, или искусственные нейронные сети, представляют собой модели машинного обучения, вдохновленные работой человеческого мозга. Они состоят из множества взаимосвязанных узлов, или "нейронов",. . .
|
Как создать нейросеть распознавания изображений на Python
InfoMaster 12.01.2025
Введение в распознавание изображений с помощью нейросетей
Распознавание изображений с помощью нейронных сетей стало одним из самых впечатляющих достижений в области искусственного интеллекта. Эта. . .
|
Основы искуственного интеллекта
InfoMaster 12.01.2025
Искусственный интеллект (ИИ) представляет собой одну из наиболее динамично развивающихся областей современной науки и технологий. В широком смысле под искусственным интеллектом понимается способность. . .
|
Python и нейросети
InfoMaster 12.01.2025
Искусственные нейронные сети стали неотъемлемой частью современных технологий, революционизировав множество областей - от медицинской диагностики до автономных транспортных средств. Python, благодаря. . .
|
Python в машинном обучении
InfoMaster 12.01.2025
Python стал неотъемлемой частью современного машинного обучения, завоевав позицию ведущего языка программирования в этой области. Его популярность обусловлена несколькими ключевыми факторами, которые. . .
|
Создание UI на Python с TKinter
InfoMaster 12.01.2025
TKinter — это одна из наиболее популярных библиотек для создания графических интерфейсов пользователей (GUI) в языке программирования Python. TKinter входит в стандартную библиотеку Python, что. . .
|
HTML5 в разработке мобильных приложений
InfoMaster 12.01.2025
Введение: Обзор роли HTML5 в мобильной разработке
В современном мире мобильных технологий HTML5 стал ключевым инструментом для разработки кроссплатформенных приложений. Эта технология произвела. . .
|