| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Для новичков > Макрос для определения количества аргументов. |
| Автор: Remiznik 13.3.2017, 11:05 | ||
Хочу написать макрос который возвращал бы количество аргументов. Долго копался в интернете нашёл несколько вариантов но они не работали в VS 2015, как я понял из-за того что студия как-то по своему разворачивает __VA_VARGS__. Но удалось найти более менее работающий вариант
проблема только в том, что для случая пустого вызова возвращает 1, может кто-то знает как это можно поправить ? |
| Автор: azesmcar 13.3.2017, 12:11 | ||
а зачем извращаться с макросами? вот на чистом C++
|
| Автор: Remiznik 13.3.2017, 12:26 | ||||
Там задача чуть сложнее, этот макрос нужен чтоб получить идекс для функции. Тоесть идея такая, я макросом хочу создать функцию с N аргументами, а потом её использовать гдето в другом месте.
Максрос реализации
проблема в том что не получается получить нужный макрос ARG_ |
| Автор: azesmcar 13.3.2017, 12:28 |
| Remiznik, все это можно сделать и через шаблоны. давай подробности если не получается. макросов лучше избегать по возможности. |
| Автор: Remiznik 13.3.2017, 12:45 | ||
Ну задача такая, удобный способ создавать однотипные функции но с разным именем, и разным количеством аргументов.
трудность в том что сначала надо определить список аргументов с типами, а потом их использовать. |
| Автор: azesmcar 13.3.2017, 13:43 |
| а зачем для этого понадобилось создавать функции? я пока сути задачи не понимаю. в твоем конкретном случае 1. можно напрямую вызывать sprintf 2. лучше sprintf не вызывать вообще (если конечно пишешь не на C а на C++) и зачем нужен ИНДЕКС функции? компилятор сам подставит нужную функцию в зависимости от количества параметров (перегрузка). |
| Автор: Remiznik 13.3.2017, 14:19 |
| Затем что в функцию зашивается константа с тексом, посмотри сигнатуру функции. Это для удобства. По каличеству параметров не подходит потому что у функций с разными именами могут быть одинаковое количество параметров. А так это всё только для удобства. Индекс нужен для ARG_№. |
| Автор: azesmcar 13.3.2017, 14:37 |
| скажи для начала, на каком языке ты пишешь? |
| Автор: Remiznik 13.3.2017, 14:43 |
| с++ |
| Автор: azesmcar 13.3.2017, 14:53 |
| Тогда избавляйся от sprintf, макросов и всего прочего. VS2015 поддерживает и variadic templates и много чего другого. Ты пытаешься на C++ писать неестественным для этого языка способом. для форматирования строк есть boost::format(), для всего прочего - шаблоны. это будет красиво, правильно, безопасно и переносимо. я пока не совсем понимаю что конкретно ты хочешь сделать, потому не могу посоветовать конкретного решения, но во всяком случае то что ты пытаешься сделать нелегально |
| Автор: Remiznik 13.3.2017, 14:58 |
| Я согласен. Но у меня есть конкретный вопрос по макросам, мне нужно посчитать количество аргументов и получить из этого другой макрос с нужным числом аргументов. Для чего это нужно я уже объяснил для генерации специальной функции нужной мне сигнатуры. Шаблоны не дают возможности делать такую кодогенерацию. |
| Автор: Remiznik 14.3.2017, 10:00 | ||
azesmcar, я написал код который работает, можешь посмотреть что получилось. Если знаешь как сделать по другому буду рад совету.
идея в том что теперь эти функции можно использовать в любом месте программы, и когда тебе нужно будет что-то вызвать компилятор подскажет какие параметры для текста нужно подставить. |
| Автор: Remiznik 15.3.2017, 11:38 |
| Супер, то что надо. Но вариант до редактуры мне понравился больше, только я не понял почему в нём нужно было передавать первым параметром шаблона char[] а с const char* не работало . |
| Автор: azesmcar 15.3.2017, 12:04 | ||
шаблон требует external linkage. http://www.comeaucomputing.com/techtalk/templates/#stringliteral |
| Автор: azesmcar 15.3.2017, 14:36 | ||
вот первый вариант |
| Автор: borisbn 16.3.2017, 18:54 | ||||||
Я бы ещё это
заменил бы на
|
| Автор: azesmcar 16.3.2017, 20:30 |
я бы вообще на boost::format заменил |