컴파일러 경고(수준 4) C4840
variadic 함수의 인수로서 'type' 클래스를 이식 불가능하게 사용했습니다.
설명
variadic 함수에 전달되는 클래스 또는 구조체는 간단하게 복사할 수 있어야 합니다. 해당 개체를 전달할 때 컴파일러는 비트 복사본을 만들기만 하고 생성자 또는 소멸자를 호출하지 않습니다.
이 경고는 Visual Studio 2017부터 사용할 수 있습니다.
예시
다음 샘플에서는 C4840을 생성하고 이를 해결하는 방법을 보여 줍니다.
// 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));
}
빌드되고 관리되는 CStringW
문자열의 경우 제공된 문자열을 operator LPCWSTR()
사용하여 형식 문자열에 필요한 C 스타일 문자열 포인터로 개체를 캐스팅 CStringW
해야 합니다.
CStringW str1;
CStringW str2;
// ...
str1.Format("%s", static_cast<LPCWSTR>(str2));