我正在重构一个旧的C库,我正在更改外部API,以便它使用std :: string而不是const char *。
ColumnType Table::getColType(const char *name) const
{
int id = getColumnId(name) ;
return getColType(id) ;
}
and
int Table::getColumnId (const char * col_name) const
{
unsigned int i = 0;
while ((i < m_table.num_cols) && (strcmp(m_table.cols[i]->name, col_name) != 0) )
i++;
if (i < m_table.num_cols)
return i;
else
return -1;
}
要:
ColumnType Table::getColType(const std::string& name_in) const
{
const char* name = name_in.c_str();
int id = getColumnId(name) ;
return getColType(id) ;
}
and
int Table::getColumnId (const std::string& col_name_in) const
{
const char* col_name = col_name_in.c_str();
unsigned int i = 0;
while ((i < m_table.num_cols) && (strcmp(m_table.cols[i]->name, col_name) != 0) )
i++;
if (i < m_table.num_cols)
return i;
else
return -1;
}
在新代码中,我将const char *传递给现在期望引用const std :: string的函数。我知道std :: string可以从const char *初始化,代码编译正确(没有警告等)。
但我只是想确保我没有做任何会在以后咬我(I18n问题)的事情。
简而言之 - 正在做什么“安全”?
答案 0 :(得分:1)
1)getColType中不需要从std :: string获取c_str(),只需传递std :: string&amp;直接进入getColumnId。
2)您应该使用被覆盖的equality operator或直接使用std::string::compare而不是strcmp。见
答案 1 :(得分:1)
这是安全的,只要正确执行,它不应该造成任何伤害。
尽管如此,我认为除非你能指出实质性的好处,否则我不建议继续这样做。
更安全的是添加一个接受const string&
的函数,并直接传递给const char*
函数。这样,您就可以让客户保持std::string&
代码而不修改内部。
例如:
ColumnType Table::getColType(const std::string& name_in) const
{
return getColType(name_in.c_str());
}
答案 2 :(得分:0)
小心std::string
s包含NULL。 C ++类对它们很好; NULL并不特别。但C字符串当然将其视为字符串结尾。以下不相同:
if (std_string_a == std_string_b) { /* C++ way */ }
// vs.
const char *cstring_a = std_string_a.c_str(),
*cstring_b = std_string_b.c_str();
if (0 == strcmp(a, b)) { /* C way */ }
当你混合搭配时,你必须担心当C ++方式错误时会出现奇怪的错误,但C方式却是真的。