为什么要重复造轮子?
在windows平台下,如果在动态库的接口中使用std::string或其它std容器,会导致崩溃或其它内存问题,所以一般要求动态库的接口必须是C语言实现。
C语言传递字符串参数有一定的限制,不够灵活,类似下面这样:
#define MAX_STRING_LEN 64
char myString[MAX_STRING_LEN];
// 字符串长度被限制在了64,不够灵活
所以自己实现一个简单够用能用的string就很有必要。
下面是我造的轮子:
struct XString
{
XString()
: m_str(NULL)
{
}
XString(const char* str)
{
copy(str);
}
XString(const char* str, uint32_t len)
{
copy(str, len);
}
~XString()
{
if (m_str != NULL)
{
delete[] m_str;
m_str = NULL;
}
}
void operator=(XString& src)
{
copy(src.str());
}
void copy(const char* str, uint32_t len)
{
m_len = len + 1;
m_str = new char[sizeof(char) * m_len];
memset(m_str, 0, sizeof(char) * m_len);
strncpy(m_str, str, m_len - 1);
}
void copy(const char* str)
{
copy(str, (uint32_t)strlen(str));
}
const char* str()
{
return m_str;
}
char* m_str;
uint32_t m_len;
};
使用方法:
1. 定义字符串:XString xstr("abc");
2. 获取C语言字符串:xstr.str();
其它容器: