在my.h文件中,我有这个声明:
/**
* XMLReader Class
*
* Defines the required function to parse and get data from XML File
**/
class XMLReader {
public:
XMLReader();
~XMLReader();
static BOOL XmlFinder(WCHAR* argv, const WCHAR* log,const WCHAR* Pass);
/**
* Get the data from the XML Files
*
* Returns Boolean if find it
*/
static struct data
{
WCHAR NumProcess[100];
WCHAR Log[100];
WCHAR Pass[100];
WCHAR Mail[100];
WCHAR memLimit[100];
WCHAR CPULimit[100];
}data;
};
在我的.cpp文件中,我已经定义并使用了inizialized数据结构:
int wmain(int argc, WCHAR* argv[])
{
struct XMLReader::data;
wmemcpy(XMLReader::data.Log, L"mama", 50);
wmemcpy(XMLReader::data.Pass, L"am0r3", 50);
wmemcpy(XMLReader::data.CPULimit, L"am0r3", 50);
wmemcpy(XMLReader::data.Mail, L"am0r3", 50);
wmemcpy(XMLReader::data.NumProcess, L"am0r3", 50);
wmemcpy(XMLReader::data.memLimit, L"am0r3", 50);
但我仍然对VS2013错误LNK2001:错误3错误LNK2001:未解析的外部符号" public:static struct XMLReader :: data XMLReader :: data" (?data @ XMLReader @@ 2U01 @ A)C:\ Users \ Documents \ Visual Studio 2013 \ Projects \ xmlLiteExample \ C ++ \ XmlLiteReader.obj xmllitereaderTask 和
错误4错误LNK1120:1个未解析的外部C:\ Users \ Documents \ Visual Studio 2013 \ Projects \ xmlLiteExample \ C ++ \ Debug \ xmllitereaderTask.exe xmllitereaderTask
建议?
答案 0 :(得分:1)
在我的.cpp文件中,我已经定义并初始化了数据结构
你还没有。
struct XMLReader::data;
这是类型 struct XMLReader::data;
的重新声明,而不是静态类成员的定义。这种重新声明没有效果。
XMLReader::data
(无struct
)是静态数据成员的名称。您需要使用类型和名称来定义它,并且您无法在函数中定义,您必须在文件级别执行:
struct XMLReader::data XMLReader::data;
建议不要将data
用作变量和结构标记的名称。实际上,不建议使用data
作为任何名称。它不提供任何信息。当然,不要将任何东西用作struct标签和变量的名称。这令人困惑,只允许与不起眼的C功能兼容。如果你把这些东西改成不同的东西,你可以这样做:
XMLReader::options_t XMLReader::options = {
L"mama",
L"am0r3",
L"am0r3",
L"am0r3",
L"am0r3"
L"am0r3"
};
这比您尝试动态初始化成员更受欢迎,只有您自己调用未定义的行为(您不能从只有5的字符串文字中复制50个字符)。
最后但并非最不重要的是,不要使用字符数组。使用std::string
。如果必须使用(在Visual Studio中不符合标准的)宽字符,请使用std::wstring
。