Freigeben über


Compilerwarnung (Ebene 2) C5046

'Funktion': Symbol mit Typ mit nicht definierter interner Verknüpfung

Hinweise

Der Compiler hat eine Verwendung einer Funktion erkannt, die nicht über eine Definition verfügt, aber die Signatur dieser Funktion umfasst Typen, die außerhalb dieser Übersetzungseinheit nicht sichtbar sind. Da diese Typen nicht extern sichtbar sind, kann keine andere Übersetzungseinheit eine Definition für diese Funktion bereitstellen, sodass das Programm nicht erfolgreich verknüpft werden kann.

Typen, die in Übersetzungseinheiten nicht sichtbar sind, umfassen:

  • Typen, die in einem anonymen Namespace deklariert sind

  • Lokale oder unbenannte Klassen

  • Spezialisierungen von Vorlagen, die diese Typen als Vorlagenargumente verwenden.

Diese Warnung ist neu in Visual Studio 2017, Version 15.8.

Beispiel

Dieses Beispiel zeigt zwei C5046-Warnungen:

// 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.
}

Um diese Probleme zu beheben, definieren Sie die Funktionen in dieser Datei.