📅  最后修改于: 2023-12-03 15:42:08.348000             🧑  作者: Mango
在使用C++开发过程中,有时会遇到错误 C4840 的提示,错误内容为“不可移植地使用类“FString”作为可变参数函数的参数”。这个错误通常是由于在可变参数函数中使用了FString类型的参数,而FString是基于实现的类,不同的平台可能会有不同的实现方式,所以在不同的平台上可能会产生不同的行为,从而导致代码不可移植。
可变参数函数是指可以接受任意数量和类型参数的函数,在C++中使用变参模板(Variadic Templates)来实现。可变参数函数的实现方式是将参数打包成一个参数列表,然后通过参数列表来操作参数。而FString是UE4游戏引擎中的一个字符串类,它的实现方式与标准库中的字符串类可能有所不同,所以在可变参数函数中使用FString类型的参数可能会导致不可移植性。
下面是第二种解决办法的代码示例:
void MyPrintf(const TCHAR* fmt, ...)
{
va_list args;
va_start(args, fmt);
TCHAR buf[1024];
vsnprintf(buf, 1024, fmt, args);
va_end(args);
std::cout << buf << std::endl;
}
FString myString = TEXT("Hello World");
MyPrintf(TEXT("My FString is %s"), *myString);
在这个示例中,我们定义了一个名为MyPrintf的函数,该函数的第一个参数为TCHAR类型的指针fmt,表示要输出的格式化字符串;接下来的省略号表示该函数可以接受任意数量和类型的参数。在函数体中,我们使用了标准库中的vsprintf函数来将参数列表打包成字符串,这个函数接受一个名为args的参数,该参数表示参数列表的起始地址,我们可以通过va_start宏来获取该地址;在函数结束时,我们需要调用va_end宏来释放args占用的内存。最后,我们可以将FString类型的参数myString通过转换为TCHAR*类型来作为可变参数函数的参数传递。
总之,如果您遇到了错误 C4840:“不可移植地使用类“FString”作为可变参数函数的参数”,那么您需要检查是否在可变参数函数中使用了FString类型的参数,并根据具体情况采取相应的解决办法。