Interchanging const char* and std::string

Interchanging const char* and std::string

本文关键字:std string and const char Interchanging      更新时间:2023-10-16

我正在重构一个旧的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问题)。

简而言之——我所做的是"安全的"吗?

只要正确执行,它是安全的,不会造成任何伤害。

尽管如此,除非你能指出一个实质性的好处,否则我认为我不会建议你继续这样做。

可能更安全的方法是添加一个接受const string&的函数,并直接传递到const char*函数。这样,您就可以让客户端保留std::string&代码,而无需修改内部代码。

例如:

ColumnType Table::getColType(const std::string& name_in) const
{
    return getColType(name_in.c_str());
}

1)不需要在getColType中从std::string中获取c_str(),只需传递std::string&

2)您应该使用重写的相等操作符或直接使用std::string::compare而不是strcmp。看到

小心包含null的std::string s。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 */ }

当你混合和匹配时,你必须担心奇怪的bug,当c++的方式显示为假,而C的方式显示为真。