Wat*_*oto 3 c++ linux 64-bit printf
我是Bitfighter的主要开发者,并且在将游戏移植到64位Linux时遇到了问题.这应该是一个相对容易和常见的问题,但它已经困扰了许多人,我找不到有关它的好信息.
[[该代码使用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);
}
Run Code Online (Sandbox Code Playgroud)
这在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*)'
Run Code Online (Sandbox Code Playgroud)
我尝试了很多变种,包括:
return vsnprintf(buffer, bufferSize, format, (va_list) arglist);
Run Code Online (Sandbox Code Playgroud)
没有成功.
有没有人有任何想法如何使这个结构可移植,或使用更多的64位友好机制实现相同的目的?
并且,对于奖励积分:-)谁能告诉我va_list_tag thingy来自哪里?
谢谢!
============================================
以下是我们解决的解决方案,使用不同的示例:
logprintf("Hello %s", name);
Run Code Online (Sandbox Code Playgroud)
电话
void logprintf(const char *format, ...)
{
va_list s;
va_start( s, format );
logger(LogConsumer::GeneralFilter, format, s);
va_end(s);
}
Run Code Online (Sandbox Code Playgroud)
电话
void logger(LogConsumer::FilterType filtertype, const char *format, va_list args)
{
char buffer[4096];
vsnprintf(buffer, sizeof(buffer), format, args);
Platform::outputDebugString(buffer);
}
Run Code Online (Sandbox Code Playgroud)
更改
S32 dVsprintf(char *buffer, int bufferSize, const char *format, void *arglist)
Run Code Online (Sandbox Code Playgroud)
至
S32 dVsprintf(char *buffer, size_t bufferSize, const char *format, va_list arglist)
Run Code Online (Sandbox Code Playgroud)
它应该在没有演员的情况下工作.
归档时间: |
|
查看次数: |
6480 次 |
最近记录: |