Обмен const char * и std :: string - PullRequest
1 голос
/ 27 октября 2011

Я реорганизую старую библиотеку 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;
}

To:

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 вопросов в стороне).

Короче говоря, что делает "безопасно"?

Ответы [ 3 ]

1 голос
/ 27 октября 2011

Это безопасно, поскольку выполнено правильно, оно не должно причинять вреда.

Тем не менее, я не думаю, что я бы рекомендовал продолжать это, если вы не можете указать на существенную выгоду.

Что может быть безопаснее, это добавить функцию, которая принимает значение const string& и выполняет прямой переход к функции const char*. Таким образом, вы позволяете клиентам придерживаться кода std::string& без изменения внутренних компонентов.

Например:

ColumnType Table::getColType(const std::string& name_in) const
{
    return getColType(name_in.c_str());
}
1 голос
/ 27 октября 2011

1) Нет необходимости в getColType для получения c_str () из std :: string, просто передайте std :: string & непосредственно в getColumnId.

2) Вы должны использовать переопределенный оператор равенства или использовать std :: string :: Compare напрямую вместо strcmp. Смотри

0 голосов
/ 27 октября 2011

Остерегайтесь 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 ++ говорит false, а путь C говорит true.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...