Compartir a través de


Advertencia del compilador (nivel 2) C5046

"function": símbolo que implica un tipo con una vinculación interna no definida

Comentarios

El compilador detectó el uso de una función que no tiene una definición, pero la signatura de esta función implica tipos que no son visibles fuera de esta unidad de traducción. Como estos tipos no son visibles externamente, ninguna otra unidad de traducción puede proporcionar una definición para esta función, por lo que el programa no se puede vincular correctamente.

Los tipos que no son visibles entre unidades de traducción incluyen:

  • Tipos declarados dentro de un espacio de nombres anónimo

  • Clases locales o sin nombre

  • Especializaciones de plantillas que usan estos tipos como argumentos de plantilla.

Esta advertencia es nueva en Visual Studio 2017, versión 15.8.

Ejemplo

En este ejemplo, se muestran dos advertencias 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.
}

Para corregir estos problemas, defina las funciones de este archivo.