다음을 통해 공유


컴파일러 경고(수준 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));