C++ 中warning C4251请大家进来帮忙看看,该怎么解决
C++ 中warning C4251请大家进来帮忙看看
typedef struct _transaction_process
{
char TX_CODE[9];
char TX_NAME[61];
char TX_MAIN_SERIAL[24];
}
_transaction_process m_trans_process;
在VC++6.0中编译报错为:warning C4251: 'm_trans_process' : struct '_transaction_process' needs to have dll-interface to be used by clients of class 'CBuMainData'
see declaration of '_transaction_process'
始终不明白C4251这个错误究竟warning在哪里,请各位大虾指导谢谢。
------解决方案--------------------
typedef struct{
char TX_CODE[9];
char TX_NAME[61];
char TX_MAIN_SERIAL[24];
} _transaction_process ;
定义改成这样试试?
------解决方案--------------------
Visual C++ 概念:生成 C/C++ 程序
编译器警告(等级 1)C4251
错误消息
“identifier”: 类“type”需要由类“type2”的客户端使用 dll 接口
要在使用 __declspec(dllexport) 导出类时使数据损坏的可能性降到最小,请确保:
通过从 DLL 导出的函数访问所有静态数据。
类的任何内联方法都不能修改静态数据。
类的所有内联方法都不使用 CRT 函数或使用静态数据的其他库函数(有关更多信息,请参见 PRB:跨 DLL 边界传递 CRT 对象时可能出现的错误)。
如果 EXE 和 DLL 中的实例化具有静态数据差异时,类的任何方法(无论是否为内联)都不能使用类型。
通过定义一个 DLL 可以避免导出类,该 DLL 定义一个具有虚函数的类,您可以调用这些函数对该类型的对象进行实例化和删除。 然后在该类型上调用虚函数即可。
有关导出模板的更多信息,请参见 http://support.microsoft.com/default.aspx?scid=kb;zh-cn;168958。
如果要从标准 C++ 库中的类型派生,并且要编译调试版本 (/MTd),而且编译器错误信息引用 _Container_base,则在 Microsoft Visual C++ 2005 中可以忽略 C4251。
复制代码
// C4251.cpp
// compile with: /EHsc /MTd /W2 /c
#include <vector>
using namespace std;
class Node;
class __declspec(dllimport) VecWrapper : vector<Node *> {}; // C4251
楼主参考下这
http://msdn.microsoft.com/zh-cn/library/esew7y1w(VS.80).aspx
typedef struct _transaction_process
{
char TX_CODE[9];
char TX_NAME[61];
char TX_MAIN_SERIAL[24];
}
_transaction_process m_trans_process;
在VC++6.0中编译报错为:warning C4251: 'm_trans_process' : struct '_transaction_process' needs to have dll-interface to be used by clients of class 'CBuMainData'
see declaration of '_transaction_process'
始终不明白C4251这个错误究竟warning在哪里,请各位大虾指导谢谢。
------解决方案--------------------
typedef struct{
char TX_CODE[9];
char TX_NAME[61];
char TX_MAIN_SERIAL[24];
} _transaction_process ;
定义改成这样试试?
------解决方案--------------------
Visual C++ 概念:生成 C/C++ 程序
编译器警告(等级 1)C4251
错误消息
“identifier”: 类“type”需要由类“type2”的客户端使用 dll 接口
要在使用 __declspec(dllexport) 导出类时使数据损坏的可能性降到最小,请确保:
通过从 DLL 导出的函数访问所有静态数据。
类的任何内联方法都不能修改静态数据。
类的所有内联方法都不使用 CRT 函数或使用静态数据的其他库函数(有关更多信息,请参见 PRB:跨 DLL 边界传递 CRT 对象时可能出现的错误)。
如果 EXE 和 DLL 中的实例化具有静态数据差异时,类的任何方法(无论是否为内联)都不能使用类型。
通过定义一个 DLL 可以避免导出类,该 DLL 定义一个具有虚函数的类,您可以调用这些函数对该类型的对象进行实例化和删除。 然后在该类型上调用虚函数即可。
有关导出模板的更多信息,请参见 http://support.microsoft.com/default.aspx?scid=kb;zh-cn;168958。
如果要从标准 C++ 库中的类型派生,并且要编译调试版本 (/MTd),而且编译器错误信息引用 _Container_base,则在 Microsoft Visual C++ 2005 中可以忽略 C4251。
复制代码
// C4251.cpp
// compile with: /EHsc /MTd /W2 /c
#include <vector>
using namespace std;
class Node;
class __declspec(dllimport) VecWrapper : vector<Node *> {}; // C4251
楼主参考下这
http://msdn.microsoft.com/zh-cn/library/esew7y1w(VS.80).aspx