Udostępnij za pośrednictwem


Ostrzeżenie kompilatora (poziom 2) C5046

"function" : Symbol obejmujący typ z niezdefiniowane połączenie wewnętrzne

Uwagi

Kompilator wykrył użycie funkcji, która nie ma definicji, ale podpis tej funkcji obejmuje typy, które nie są widoczne poza tą jednostką tłumaczenia. Ponieważ te typy nie są widoczne zewnętrznie, żadna inna jednostka tłumaczenia nie może podać definicji tej funkcji, więc program nie może być pomyślnie połączony.

Typy, które nie są widoczne w jednostkach tłumaczenia, obejmują:

  • Typy zadeklarowane wewnątrz anonimowej przestrzeni nazw

  • Klasy lokalne lub nienazwane

  • Specjalizacje szablonów, które używają tych typów jako argumentów szablonu.

To ostrzeżenie jest nowe w programie Visual Studio 2017 w wersji 15.8.

Przykład

W tym przykładzie przedstawiono dwa ostrzeżenia 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.
}

Aby rozwiązać te problemy, zdefiniuj funkcje w tym pliku.