📜  错误 C4840:不可移植地使用类“FString”作为可变参数函数的参数 - C++ (1)

📅  最后修改于: 2023-12-03 15:42:08.348000             🧑  作者: Mango

错误 C4840:不可移植地使用类“FString”作为可变参数函数的参数 - C++

在使用C++开发过程中,有时会遇到错误 C4840 的提示,错误内容为“不可移植地使用类“FString”作为可变参数函数的参数”。这个错误通常是由于在可变参数函数中使用了FString类型的参数,而FString是基于实现的类,不同的平台可能会有不同的实现方式,所以在不同的平台上可能会产生不同的行为,从而导致代码不可移植。

原因

可变参数函数是指可以接受任意数量和类型参数的函数,在C++中使用变参模板(Variadic Templates)来实现。可变参数函数的实现方式是将参数打包成一个参数列表,然后通过参数列表来操作参数。而FString是UE4游戏引擎中的一个字符串类,它的实现方式与标准库中的字符串类可能有所不同,所以在可变参数函数中使用FString类型的参数可能会导致不可移植性。

解决办法
  1. 改为使用标准库中的字符串类,如std::string或std::wstring等。
  2. 将FString类型的参数转换为其底层数据类型(如TCHAR*),然后再将其作为可变参数函数的参数传递。
  3. 不使用可变参数函数,而是使用固定参数列表的函数,或者使用模板来实现可变参数。

下面是第二种解决办法的代码示例:

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类型的参数,并根据具体情况采取相应的解决办法。