Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
zamiast przenośnego użycia klasy "type" jako argumentu do funkcji wariadycznej
Uwagi
Klasy lub struktury przekazywane do funkcji wariadycznej muszą być trywialnie kopiowalne. Podczas przekazywania takich obiektów kompilator po prostu wykonuje kopię bitową i nie wywołuje konstruktora ani destruktora.
To ostrzeżenie jest dostępne począwszy od programu Visual Studio 2017.
Przykład
Poniższy przykład generuje kod C4840 i pokazuje, jak go naprawić:
// C4840.cpp
// compile by using: cl /EHsc /W4 C4840.cpp
#include <stdio.h>
int main()
{
struct S {
S(int i) : i(i) {}
S(const S& other) : i(other.i) {}
operator int() { return i; }
private:
int i;
} s(0);
printf("%i\n", s); // warning C4840 : non-portable use of class 'main::S'
// as an argument to a variadic function
// To correct the error, you can perform a static cast
// to convert the object before passing it:
printf("%i\n", static_cast<int>(s));
}
W przypadku ciągów skompilowanych i zarządzanych przy użyciu CStringW
parametru należy użyć elementu operator LPCWSTR()
, aby rzutować CStringW
obiekt do wskaźnika ciągu w stylu C oczekiwanego przez ciąg formatu:
CStringW str1;
CStringW str2;
// ...
str1.Format("%s", static_cast<LPCWSTR>(str2));