Поделиться через


Предупреждение компилятора (уровень 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.
}

Чтобы устранить эти проблемы, определите функции в этом файле.