【发布时间】:2011-10-26 21:37:32
【问题描述】:
我正在重构一个旧的 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 char*,而不是string本身?我唯一能想到的是每次调用都会有不必要的副本...... -
遗憾的是,C++ 对象不能很好地跨越库边界。或者更具体地说,如果两侧使用不同的库、不同的编译器、不同的设置或一天中的不同时间编译,它可能会失败......
-
@MooingDuck,当然;不过,从他的 sn-p 看来,对接受
std::string的getColumnId的调用似乎传递了const char*- 真的有点多余...... -
@Nim:我的错,没看到。 HomunculusReticulli:当你立即将它们转换回
const char*然后忽略它们时,为什么你有接受字符串的函数?这会强制复制不需要的副本。 -
@Nim:是的,我意识到正在制作额外的字符串副本——但我不想对 500 多个函数进行大规模重构。这是“第一次通过”(仅处理 API),一旦工作(确实如此),然后我打算清理内部(比如摆脱不必要的字符串复制等)。