gpt4 book ai didi

c++ - va_args 和 64 位

转载 作者:IT王子 更新时间:2023-10-29 00:56:57 25 4
gpt4 key购买 nike

我是 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);
}

最佳答案

改变

S32 dVsprintf(char *buffer, int bufferSize, const char *format, void *arglist)

S32 dVsprintf(char *buffer, size_t bufferSize, const char *format, va_list arglist)

它应该在没有类型转换的情况下工作。

关于c++ - va_args 和 64 位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2138400/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com