Я ведущий разработчик Bitfighter , и у меня проблемы с переносом игры на 64-битный Linux. Это должно быть относительно простой и распространенной проблемой, но это поставило многих в тупик, и я не смог найти никакой хорошей информации об этом.
[[Код компилируется в 32-битной версии gcc 4.1.2 и др. И не работает с несколькими вариантами 64-битной Linux, но я полагаюсь на отчеты других и не имею точной версии GCC, который терпит неудачу. Но он не работает для нескольких людей на разных вкусах Linux. Я на 99% уверен, что это не проблема версии компилятора. ]]
У меня есть следующее:
void UserInterface::drawCenteredString(int y, int size, const char *format, ...)
{
va_list args;
va_start(args, format);
char buffer[2048];
dVsprintf(buffer, sizeof(buffer), format, args);
va_end(args);
drawCenteredString2(y, size, buffer);
}
// Elsewhere, in platform.cpp... (this is where the error occurs)
S32 dVsprintf(char *buffer, int bufferSize, const char *format, void *arglist)
{
return vsnprintf(buffer, bufferSize, format, (char *) arglist);
}
Отлично работает на 32-битных платформах. Однако, когда я компилирую его на 64-битном Linux, он терпит неудачу:
platform.cpp:457: error: cannot convert 'char*' to '__va_list_tag*' for argument '4' to 'int TNL::vsnprintf(char*, size_t, const char*, __va_list_tag*)'
Я пробовал много вариантов, в том числе:
return vsnprintf(buffer, bufferSize, format, (va_list) arglist);
без успеха.
У кого-нибудь есть идеи о том, как сделать эту конструкцию переносимой или достичь тех же целей с помощью более 64-битного дружественного механизма?
А что касается бонусных баллов :-) Может кто-нибудь сказать мне, откуда взялась вещь va_list_tag?
Спасибо!
============================================
Вот решение, на котором мы остановились, используя другой пример:
logprintf("Hello %s", name);
называет
void logprintf(const char *format, ...)
{
va_list s;
va_start( s, format );
logger(LogConsumer::GeneralFilter, format, s);
va_end(s);
}
звонки
void logger(LogConsumer::FilterType filtertype, const char *format, va_list args)
{
char buffer[4096];
vsnprintf(buffer, sizeof(buffer), format, args);
Platform::outputDebugString(buffer);
}