Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
'type': 'type1' debe tener dll-interface para que lo usen los clientes de 'type2'
Comentarios
Esta advertencia se produce si una clase está marcada con __declspec(dllexport) o __declspec(dllimport) y un miembro de datos no estático que es miembro de la clase o un miembro de una de sus clases base, tiene un tipo que es un tipo de clase que no está marcado con __declspec(dllexport) o __declspec(dllimport). Consulte Ejemplo.
Para minimizar la posibilidad de corrupción de datos al exportar una clase declarada como __declspec(dllexport), asegúrese de que:
- A los datos estáticos se accede a través de funciones que se exportan desde el archivo DLL.
- Ninguno de los métodos insertados de la clase puede modificar los datos estáticos.
- Ninguno de los métodos insertados de la clase usa funciones de CRT u otras funciones de biblioteca que usan datos estáticos. Para obtener más información, consulte Errores potenciales de transferencia de objetos CRT a través de límites DLL.
- Ninguno de los métodos de tu clase (insertados o no) pueden usar tipos donde la instanciación en EXE y DLL tenga diferencias en los datos estáticos.
Puede evitar problemas al exportar una clase desde una DLL al:
- Definir la clase para que tenga funciones virtuales.
- Definir un destructor virtual.
- Definir funciones para crear y eliminar instancias del tipo.
Puede omitir C4251 si la clase se deriva de un tipo en la biblioteca estándar de C++, está compilando una versión de depuración (/MTd) y el mensaje de error del compilador hace referencia a _Container_base.
Piense detenidamente en agregar __declspec(dllexport) o __declspec(dllimport) a una clase porque casi siempre no es la opción adecuada y puede dificultar el mantenimiento porque dificulta el cambio de los detalles de implementación.
Ejemplo
En el ejemplo que se muestra a continuación se genera la advertencia C4251:
// C4251.cpp
// Compile with /std:c++20 /EHsc /W2 /c C4251.cpp
#include <vector>
class __declspec(dllexport) X
{
public:
X();
~X();
void do_something();
private:
void do_something_else();
std::vector<int> data; // warning c4251
};
Para corregir esta advertencia, no marque la clase con __declspec(dllexport) o __declspec(dllimport). En su lugar, solo marque los métodos que usa directamente un cliente. Por ejemplo:
// C4251_fixed.cpp
// Compile with /std:c++20 /EHsc /W2 /c C4251-fixed.cpp
#include <vector>
class X
{
public:
__declspec(dllexport) X();
__declspec(dllexport) ~X();
__declspec(dllexport) void do_something();
private:
void do_something_else();
std::vector<int> data;
};