LINUX.ORG.RU

Как бы так извернуться на C++...


0

0

Занимаюсь сейчас перетаскиванием некоей либы с винды на линукс, все бы хорошо кроме одного момента, есть там такой код:

#ifdef UNICODE
#define _stprintf swprintf
#elseif
#define _stprintf sprintf
#endif

Если без #define UNICODE, то все нормально, а вот иначе лезут ошибки, ибо в линуксе у sprintf и swprintf разные аргументы (чего видимо нет в винде).
int sprintf(char *str, const char *format, ...);
int swprintf(wchar_t *wcs, size_t maxlen,const wchar_t *format, ...);

Нужно как-то добиться нормальной компиляции юникодной версии, перелопачивать весь остальной код не пойдет. Надо написать какой-то макрос или свою функцию которая бы принимала те же аргументы что и виндовая swprintf. Однако я не могу сообразить как передать произвольное число аргументов в другую функцию...

Хоть я и путано все изложил, но надеюсь понятно что мне надо?


В ISO C

int swprintf (wchar_t *, size_t, const wchar_t *, ...);

если в коде используется swprintf также как(без maxlen) и sprintf, хотя должно быть больше похоже на snprintf (с maxlen) - то попробуй так:

#ifdef UNICODE #define _stprintf(a, b, c...) swprintf(a, (size_t)-1, b, ##c)

p.s. то что находится выше - называется КОСТЫЛЬ

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

Не, не работает
на вот такой код:
_stprintf(str,_T("%d:%d:%d"),xx,yy,zz)
ругается
pasting "," and "c" does not give a valid preprocessing token

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

ты случаем не поставил запятую в макросе между с и многоточием?

p.s. ты код копипастил или переписал руками?

legk
()
Ответ на: комментарий от bugmaker

ваш и мой варианты отличаются перечнем ошибок , если передавать в макрос один аргумент.

у вас скажет, что недостаточно параметров у swprintf. у меня - недостаточно параметров у макроса. а так, вообщем-то, неважно =)

legk
()

>Однако я не могу сообразить как передать произвольное число аргументов в другую функцию...

man 3 stdarg

anonymous
()

Уж не знаю почему у меня вчера не работало, но сегодня на трезвую голову я все перепроверил и теперь все работает так:
#define _stprintf(aa, bb...) swprintf(aa,wcslen(aa)-1,##bb)

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