Форум — Development Можно ли создать кастомную обвертку вокруг printf не прибегая к va_* макросам? printf, stdarg 0 2 меня это интересует в разрезе отсутствия v* ф-й необходимых для работы с va_* макросами Ссылка
В С++x11 это классический пример использования шаблона с переменным числом аргументов. AIv ★★★★★ (21.12.12 20:54:00 MSK) Ссылка
да, можно как-то так:void func(int count, int param, ...) { int *argptr = ¶m; for (int i = 0; i < count; i++, argptr++) { printf("%d\n", *argptr); } } Только могут быть проблемы с типами, размер которых не равен размеру слова в стеке (в частности с double и прочими). KennyMinigun ★★★★★ (21.12.12 20:57:17 MSK) Последнее исправление: KennyMinigun 21.12.12 21:02:36 MSK (всего исправлений: 3) Показать ответ Ссылка
Можно ли создать кастомную обвертку вокруг printf не прибегая к va_* макросам?да. Посмотри, там довольно просто делается.меня это интересует в разрезе отсутствия v* ф-й необходимых для работы с va_* макросамичего конкретно ты хочешь? drBatty ★★ (21.12.12 21:01:22 MSK) Ссылка
Ответ на: комментарий от KennyMinigun 21.12.12 20:57:17 MSK Только могут быть проблемы с типами, размер которых не равен размеру слова в стеке.это решается кастом указателей. На x86 должно работать (в принципе. Я не пробовал этот быдлокод). drBatty ★★ (21.12.12 21:03:06 MSK) Показать ответ Ссылка
Ответ на: комментарий от drBatty 21.12.12 21:03:06 MSK (в принципе. Я не пробовал этот быдлокод).http://ideone.com/mjWJjP KennyMinigun ★★★★★ (21.12.12 21:09:19 MSK) Показать ответы Ссылка
Ответ на: комментарий от KennyMinigun 21.12.12 21:09:19 MSK ты не понял: работать оно будет. Но я не могу дать никаких гарантий, что оно сработает не только у меня.Впрочем... Вот выхлоп на x86-32 0 1 2 3 0.000000 -0.000000 -1.591454 0.000000 failx86-64 0 4 1180262944 3 0.000000 0.000000 0.000000 0.000000 fail^2Итог - нерабочий быдлокод. drBatty ★★ (21.12.12 21:26:45 MSK) Ссылка
Ответ на: комментарий от KennyMinigun 21.12.12 21:09:19 MSK Фишка в том, что ты _думаешь_, что передавать параметры будем через стек, но IRL так бывает только в x86-32, и то - для целых. Дробные в 86-32 передаются в FPU стеке, а для 64 - в SSE (и те и другие). drBatty ★★ (21.12.12 21:29:09 MSK) Показать ответ Ссылка
выкрутился с макросами используя вспомогательную vsnprintf() cvv ★★★★★ (21.12.12 21:36:55 MSK) автор топика Ссылка
Ответ на: комментарий от drBatty 21.12.12 21:29:09 MSK Фишка в том, что ты _думаешь_, что передавать параметры будем через стек,Я так не думаю. Я прекрасно понимаю где говно в таком решении, спасибо за попытку разъяснить. x86-32 fail x86-64 fail^2У меня вышло с точностью до наоборот. KennyMinigun ★★★★★ (21.12.12 21:42:51 MSK) Показать ответ Ссылка
Ответ на: комментарий от KennyMinigun 21.12.12 21:42:51 MSK Я так не думаю. Я прекрасно понимаю где говно в таком решении, спасибо за попытку разъяснить.считай, что это не для тебя. Хотя объяснять, почему это говнокод должен вообще-то автор (раз он прекрасно понимает).У меня вышло с точностью до наоборот.что, всё работает? drBatty ★★ (21.12.12 21:54:52 MSK) Показать ответ Ссылка
Ответ на: комментарий от drBatty 21.12.12 21:54:52 MSK что, всё работает?Не работает. Только не работает наоборот. KennyMinigun ★★★★★ (21.12.12 22:03:57 MSK) Ссылка