다음을 통해 공유


컴파일러 경고(수준 2) C5046

'function': 내부 링크가 정의되지 않은 형식과 관련된 기호

설명

컴파일러에서 정의가 없는 함수의 사용을 감지했지만 이 함수의 서명에는 이 변환 단위 외부에서 표시되지 않는 형식이 포함됩니다. 이러한 형식은 외부에 표시되지 않으므로 다른 번역 단위는 이 함수에 대한 정의를 제공할 수 없으므로 프로그램을 성공적으로 연결할 수 없습니다.

번역 단위에 표시되지 않는 형식은 다음과 같습니다.

  • 익명 네임스페이스 내에 선언된 형식

  • 로컬 또는 이름 없는 클래스

  • 이러한 형식을 템플릿 인수로 사용하는 템플릿의 특수화입니다.

이 경고는 Visual Studio 2017 버전 15.8의 새로운 기능입니다.

예시

이 샘플에서는 두 가지 C5046 경고를 보여 줍니다.

// C5046p.cpp
// compile with: cl /c /W2 C5046p.cpp

namespace {
    struct S {
        // S::f is inside an anonymous namespace and cannot be defined outside
        // of this file. If used, it must be defined somewhere in this file.
        int f();
    };
}

// g has a pointer to an unnamed struct as a parameter type. This type is
// distinct from any similar type declared in other files, so this function
// cannot be defined in any other file.
// Note that if the struct was declared "typedef struct { int x; int y; } S, *PS;"
// it would have a "typedef name for linkage purposes" and g could be defined
// in another file that provides a compatible definition for S.

typedef struct { int x; int y; } *PS;
int g(PS p);

int main()
{
    S s;
    s.f();      // C5046 f is undefined and can't be defined in another file.
    g(nullptr); // C5046 g is undefined and can't be defined in another file.
}

이러한 문제를 해결하려면 이 파일의 함수를 정의합니다.