|
Модераторы: bsa |
|
Remiznik |
|
|||
Опытный Профиль Группа: Участник Сообщений: 379 Регистрация: 30.4.2005 Репутация: 1 Всего: 1 |
Хочу написать макрос который возвращал бы количество аргументов. Долго копался в интернете нашёл несколько вариантов но они не работали в VS 2015, как я понял из-за того что студия как-то по своему разворачивает __VA_VARGS__. Но удалось найти более менее работающий вариант
проблема только в том, что для случая пустого вызова возвращает 1, может кто-то знает как это можно поправить ? |
|||
|
||||
azesmcar |
|
|||
uploading... Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
а зачем извращаться с макросами? вот на чистом C++
|
|||
|
||||
Remiznik |
|
||||
Опытный Профиль Группа: Участник Сообщений: 379 Регистрация: 30.4.2005 Репутация: 1 Всего: 1 |
Там задача чуть сложнее, этот макрос нужен чтоб получить идекс для функции. Тоесть идея такая, я макросом хочу создать функцию с N аргументами, а потом её использовать гдето в другом месте.
Максрос реализации
проблема в том что не получается получить нужный макрос ARG_ |
||||
|
|||||
azesmcar |
|
|||
uploading... Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
Remiznik, все это можно сделать и через шаблоны. давай подробности если не получается. макросов лучше избегать по возможности.
|
|||
|
||||
Remiznik |
|
|||
Опытный Профиль Группа: Участник Сообщений: 379 Регистрация: 30.4.2005 Репутация: 1 Всего: 1 |
Ну задача такая, удобный способ создавать однотипные функции но с разным именем, и разным количеством аргументов.
трудность в том что сначала надо определить список аргументов с типами, а потом их использовать. |
|||
|
||||
azesmcar |
|
|||
uploading... Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
а зачем для этого понадобилось создавать функции? я пока сути задачи не понимаю. в твоем конкретном случае
1. можно напрямую вызывать sprintf 2. лучше sprintf не вызывать вообще (если конечно пишешь не на C а на C++) и зачем нужен ИНДЕКС функции? компилятор сам подставит нужную функцию в зависимости от количества параметров (перегрузка). |
|||
|
||||
Remiznik |
|
|||
Опытный Профиль Группа: Участник Сообщений: 379 Регистрация: 30.4.2005 Репутация: 1 Всего: 1 |
Затем что в функцию зашивается константа с тексом, посмотри сигнатуру функции. Это для удобства. По каличеству параметров не подходит потому что у функций с разными именами могут быть одинаковое количество параметров. А так это всё только для удобства.
Индекс нужен для ARG_№. Это сообщение отредактировал(а) Remiznik - 13.3.2017, 14:20 |
|||
|
||||
azesmcar |
|
|||
uploading... Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
скажи для начала, на каком языке ты пишешь?
|
|||
|
||||
Remiznik |
|
|||
Опытный Профиль Группа: Участник Сообщений: 379 Регистрация: 30.4.2005 Репутация: 1 Всего: 1 |
с++
|
|||
|
||||
azesmcar |
|
|||
uploading... Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
Тогда избавляйся от sprintf, макросов и всего прочего. VS2015 поддерживает и variadic templates и много чего другого. Ты пытаешься на C++ писать неестественным для этого языка способом.
для форматирования строк есть boost::format(), для всего прочего - шаблоны. это будет красиво, правильно, безопасно и переносимо. я пока не совсем понимаю что конкретно ты хочешь сделать, потому не могу посоветовать конкретного решения, но во всяком случае то что ты пытаешься сделать нелегально Это сообщение отредактировал(а) azesmcar - 13.3.2017, 14:54 |
|||
|
||||
Remiznik |
|
|||
Опытный Профиль Группа: Участник Сообщений: 379 Регистрация: 30.4.2005 Репутация: 1 Всего: 1 |
Я согласен. Но у меня есть конкретный вопрос по макросам, мне нужно посчитать количество аргументов и получить из этого другой макрос с нужным числом аргументов. Для чего это нужно я уже объяснил для генерации специальной функции нужной мне сигнатуры. Шаблоны не дают возможности делать такую кодогенерацию.
|
|||
|
||||
Remiznik |
|
|||
Опытный Профиль Группа: Участник Сообщений: 379 Регистрация: 30.4.2005 Репутация: 1 Всего: 1 |
azesmcar, я написал код который работает, можешь посмотреть что получилось. Если знаешь как сделать по другому буду рад совету.
идея в том что теперь эти функции можно использовать в любом месте программы, и когда тебе нужно будет что-то вызвать компилятор подскажет какие параметры для текста нужно подставить. |
|||
|
||||
azesmcar |
|
||||
uploading... Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
Ты написал абсолютно непонятный, нечитабельный и непереносимый код. во первых на gcc это скорее всего даже не скомпилируется И вопрос даже не в том работает он или нет, вопрос в том, что такой код нельзя писать в приличном обществе реальных проектах. Я не понимаю саму необходимость этого, но если оооочень надо, то пожалуйста. легальные 11-ые плюсы.
Это сообщение отредактировал(а) azesmcar - 14.3.2017, 12:36 |
||||
|
|||||
Remiznik |
|
|||
Опытный Профиль Группа: Участник Сообщений: 379 Регистрация: 30.4.2005 Репутация: 1 Всего: 1 |
Супер, то что надо. Но вариант до редактуры мне понравился больше, только я не понял почему в нём нужно было передавать первым параметром шаблона char[] а с const char* не работало .
|
|||
|
||||
azesmcar |
|
|||
uploading... Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
шаблон требует external linkage. http://www.comeaucomputing.com/techtalk/te.../#stringliteral Это сообщение отредактировал(а) azesmcar - 15.3.2017, 14:23 |
|||
|
||||
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |