我是Bitfighter的主要開發人員,並且在將遊戲移植到64位Linux時遇到問題。這應該是一個相對容易和常見的問題,但它已經讓很多人難堪,我一直沒有找到有關它的好消息。va_args和64位
[[該代碼使用gcc版本4.1.2等編譯成32位,並且在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 thingy來自哪裏?
謝謝!
============================================
這是我們決定,使用不同的示例中的解決方案:
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);
}
請問您是否可以添加指示哪條線路發生錯誤的信息?在UserInterface :: drawCenteredString裏面還是在dVsprintf裏面?另外,請添加,什麼編譯器(確切版本)和你使用什麼操作系統(哪個Linux)。 – 2010-01-26 10:10:41
我修改了這個問題,以澄清定義dVsprintf()時發生的錯誤。 – Watusimoto 2010-01-26 23:10:07
在某些64位實現中'va_list'不僅僅是指向堆棧的指針,就像通常的x86 C調用約定一樣。這是因爲前幾個參數是通過寄存器傳遞的。 – 2010-02-11 06:33:45