我有一个头文件,声明了每个函数的声明:
#ifndef TYPECONVERTER_H_INCLUDED
#define TYPECONVERTER_H_INCLUDED
#include <iostream>
#include <string>
#include <vector>
#include <Windows.h>
using namespace std;
unsigned int letter2number(char input);
char number2letter(unsigned int input);
string chararr2string(char *input);
string char2string(char input);
char string2char(string input);
char *string2chararr(string input);
string int2string(int input);
int string2int(string input);
wstring string2wstring(const std::string& input);
LPSTR string2lpstr(string input);
vector<int> intarr2intvector(int input[]);
int *vectorint2intarr(vector<int> input);
vector<string> strarr2vectorstr(string *input);
string *vectorstr2strarr(vector<string> input);
vector<char> chararr2vectorchar(char *input);
char *chararr2vector(vector<char> input);
string wchar2string(WCHAR wc[260]);
#endif
然后是带有实际功能的.cpp文件:
#include "stdafx.h"
#include <iostream>
#include <string>
#include <vector>
#include <Windows.h>
#include "TypeConverter.h"
using namespace std;
unsigned int letter2number(char input)
{
if(input >= 'A' && input <= 'Z')
return input - 64;
else if(input >= 'a' && input <= 'z')
return input - 96;
return 0;
}
char number2letter(unsigned int input)
{
if(input >= 1 && input <= 26)
return input + 96;
return 'a';
}
string chararr2string(char *input)
{
string ret(input);
return ret;
}
string char2string(char input)
{
string ret = "";
ret += input;
return ret;
}
char string2char(string input)
{
return input[0];
}
char *string2chararr(string input)
{
char *ret=new char[input.size()+1];
ret[input.size()]=0;
memcpy(ret,input.c_str(),input.size());
return ret;
}
string int2string(int input)
{
return std::to_string(input);
}
int string2int(string input)
{
try{
stoi(input);
return stoi(input);
}
catch(std::invalid_argument){
return 1;
}
}
wstring string2wstring(const std::string& input)
{
std::wstring ret = std::wstring(input.begin(), input.end());
return ret;
}
LPSTR string2lpstr(string input)
{
return const_cast<char *>(input.c_str());
}
vector<int> intarr2intvector(int input[])
{
std::vector<int> ret(input, input + sizeof input / sizeof input[0]);
return ret;
}
int *vectorint2intarr(vector<int> input)
{
int *ret = &input[0];
return ret;
}
vector<string> strarr2vectorstr(string *input)
{
std::vector<string> ret(input, input + sizeof input / sizeof input[0]);
return ret;
}
string *vectorstr2strarr(vector<string> input)
{
string *ret = &input[0];
return ret;
}
vector<char> chararr2vectorchar(char *input)
{
std::vector<char> ret(input, input + sizeof input / sizeof input[0]);
return ret;
}
char *chararr2vector(vector<char> input)
{
char *ret = &input[0];
return ret;
}
string wchar2string(WCHAR wc[260])
{
char ch[260];
char DefChar = ' ';
WideCharToMultiByte(CP_ACP,0,wc,-1, ch,260,&DefChar, NULL);
std::string ss(ch);
return ss;
}
当我使用时:
#include "stdafx.h"
#include <iostream>
#include <string>
#include "TypeConverter.h"
using namespace std;
int main()
{
cout << int2string(2) << endl;
}
如果在项目中创建了两个文件,它的工作正常。但是,当我尝试通过包含&#34; TypeConverter.h&#34;来尝试在不同的程序中执行相同的操作时。它给了我一个LNK2019&#34;未解决的外部符号&#34;错误。我做错了什么?
答案 0 :(得分:1)
头文件只是声明函数。您还需要定义它们。链接器错误告诉您它无法找到函数的定义。
编译定义函数的源文件,或者为链接器提供定义它们的目标文件或库。
哪些选项适合您,取决于您希望如何构建程序。但是,我的猜测是包含源文件是最好的方法。这有一个明显的好处,即您的程序将始终与源代码同步。