![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| cupper |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 525 Регистрация: 29.11.2006 Репутация: 1 Всего: 1 |
Привет, возникла потребность написать сложный макрос суть которого это создание однотипных тел функций.
Начал с малого и как и следовало возникли проблемы.
Все работает. А тут
ничего не работает Выход:
Почему так ? PS. и как правильно запустить препроцессор у gcc чтобы проверять правильность формирования макроса ? |
||||||
|
|||||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
||||
|
||||
| cupper |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 525 Регистрация: 29.11.2006 Репутация: 1 Всего: 1 |
Запуск только препроцессора делаю так
Оснвной вопрос все также остался. Появился еще один, как можно в теле макроса заставить правильно отработать __func__ чтобы получить имя функции из которой был вызван макрос ? как не пробовал он всегда так и остается как __func__ PS. было понято что __func__ это не стандартный макрос, который отрабатывает после препроцессора. Очень хотелосьбы чтобы я это понял не правильно, ибо тогда некак неполучиться сделать что то вроде
А очень хотелосьюы сделать такое Второй вопрос в том как можно скомпоновать __func__ с чемто еще, например определен макрос
? ? ? Это сообщение отредактировал(а) cupper - 11.4.2010, 23:53 |
||||||
|
|||||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
потому что ## внутри кавычек, для решения разделите на несколько макросов, один раскрывающий, один соединяющий, один оборачивающий в кавычки. Это сообщение отредактировал(а) mes - 11.4.2010, 23:51 |
|||
|
||||
| cupper |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 525 Регистрация: 29.11.2006 Репутация: 1 Всего: 1 |
непонял ка кразделить на 3 макроса, в голову лезет только вот такое
но не работает по той же причине Это сообщение отредактировал(а) cupper - 11.4.2010, 23:59 |
||||
|
|||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
||||
|
||||
| xvr |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
По поводу __func__ - это не макрос, а строковый литерал или переменная:
Это сообщение отредактировал(а) xvr - 12.4.2010, 11:31 |
||||
|
|||||
| cupper |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 525 Регистрация: 29.11.2006 Репутация: 1 Всего: 1 |
__func__ возвращает строку, без кавычек, если он ее возвращает на на этапе препроцессинга то что мешает эту строку использовать как оператор ? Основная задача такая. Есть набор макросов, есть набор однотипных функций. Каждой функции соответствует свой макрос, выглядит это примерно так
Я тело функции конечно другое, схема такая. Я хотел бы сделать универсальный макрос, чтобы независимо от функции можно было вызывать один и тот же макрос, а он бы определял определял имя функции и "собирал" нужный макрос. Но я уже начинаю понимать что это была плохая затея. И лучьше сделать макрос который будет которому передавалосьбы имя функции а в нем выстраивалась вся функция. Так и проще сделать и наглядней применять. |
|||
|
||||
| xvr |
|
||||||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Не возвращает, это не макрос препроцессора. __func__ отрабатывается компилятором Исходный код -
После препроцессора -
Результат исполнения -
|
||||||||||
|
|||||||||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
||||
|
||||
| cupper |
|
||||||||||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 525 Регистрация: 29.11.2006 Репутация: 1 Всего: 1 |
Значит изначально я все правильно понял. Тогда такой вариант точно отпадает. Спасибо. Добавлено @ 13:52 Возник еще вопрос. Вот код
В таком вариант строчка после препроцессора содержит вместо имени макросв нужно значение, все правильно. Как можно избежать зависимости от мокросов STR и __STR ? Нужно чтобы в итоге строчка была такая
Приведеный выше код абсолютно правильно отрабатывает и получает чтрочку
являющейся абсолютно правильной, но хотелосьбы избавить от макроса STR, чтобы было как то так
Но это не работает, видимо из за того что макрос стоящий в кавычках не явлеятся макросом. Можно сделать так
Но это тоже не работает. Есть ли еще варианты, или такое нельзя проделать без использования STR ? Это сообщение отредактировал(а) cupper - 12.4.2010, 13:52 |
||||||||||||||
|
|||||||||||||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
||||
|
||||
| cupper |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 525 Регистрация: 29.11.2006 Репутация: 1 Всего: 1 |
||||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |