LINUX.ORG.RU

В С++x11 это классический пример использования шаблона с переменным числом аргументов.

AIv ★★★★★
()

да, можно как-то так:

void func(int count, int param, ...) {
   int *argptr = &param;
   for (int i = 0; i < count; i++, argptr++) {
       printf("%d\n", *argptr);
   }
}

Только могут быть проблемы с типами, размер которых не равен размеру слова в стеке (в частности с double и прочими).

KennyMinigun ★★★★★
()
Последнее исправление: KennyMinigun (всего исправлений: 3)

Можно ли создать кастомную обвертку вокруг printf не прибегая к va_* макросам?

да. Посмотри, там довольно просто делается.

меня это интересует в разрезе отсутствия v* ф-й необходимых для работы с va_* макросами

чего конкретно ты хочешь?

drBatty ★★
()
Ответ на: комментарий от KennyMinigun

Только могут быть проблемы с типами, размер которых не равен размеру слова в стеке.

это решается кастом указателей. На x86 должно работать (в принципе. Я не пробовал этот быдлокод).

drBatty ★★
()
Ответ на: комментарий от KennyMinigun

ты не понял: работать оно будет. Но я не могу дать никаких гарантий, что оно сработает не только у меня.

Впрочем... Вот выхлоп на x86-32

0
1
2
3
0.000000
-0.000000
-1.591454
0.000000
fail

x86-64

0
4
1180262944
3
0.000000
0.000000
0.000000
0.000000
fail^2

Итог - нерабочий быдлокод.

drBatty ★★
()
Ответ на: комментарий от KennyMinigun

Фишка в том, что ты _думаешь_, что передавать параметры будем через стек, но IRL так бывает только в x86-32, и то - для целых. Дробные в 86-32 передаются в FPU стеке, а для 64 - в SSE (и те и другие).

drBatty ★★
()

выкрутился с макросами используя вспомогательную vsnprintf()

cvv ★★★★★
() автор топика
Ответ на: комментарий от drBatty

Фишка в том, что ты _думаешь_, что передавать параметры будем через стек,

Я так не думаю. Я прекрасно понимаю где говно в таком решении, спасибо за попытку разъяснить.

x86-32
fail
x86-64
fail^2

У меня вышло с точностью до наоборот.

KennyMinigun ★★★★★
()
Ответ на: комментарий от KennyMinigun

Я так не думаю. Я прекрасно понимаю где говно в таком решении, спасибо за попытку разъяснить.

считай, что это не для тебя. Хотя объяснять, почему это говнокод должен вообще-то автор (раз он прекрасно понимает).

У меня вышло с точностью до наоборот.

что, всё работает?

drBatty ★★
()
Ответ на: комментарий от drBatty

что, всё работает?

Не работает. Только не работает наоборот.

KennyMinigun ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.