如何避免从字符串常量到';字符*';在C++; 我想调用C++中的以下代码,我不能更改: void getAge(char *name) { // do something }

如何避免从字符串常量到';字符*';在C++; 我想调用C++中的以下代码,我不能更改: void getAge(char *name) { // do something },c++,c,arrays,char,C++,C,Arrays,Char,当我用getAge(“hello”)调用它时,它具有以下警告: warning: deprecated conversion from string constant to 'char*' 但是在C代码中没有警告。区别是什么?我如何更改呼叫以避免C++中的警告? 无法更改函数[…] 然后在函数周围编写一个包装器并复制字符串–或者,如果您感到幸运(=您知道字符串不会在原始函数中被修改),则显式丢弃常量: void getAge(char const* name) { the_namesp

当我用
getAge(“hello”)调用它时,它具有以下警告:

warning: deprecated conversion from string constant to 'char*'
但是在C代码中没有警告。区别是什么?我如何更改呼叫以避免C++中的警告?

无法更改函数[…]

然后在函数周围编写一个包装器并复制字符串–或者,如果您感到幸运(=您知道字符串不会在原始函数中被修改),则显式丢弃常量:

void getAge(char const* name) {
    the_namespace::getAge(const_cast<char*>(name));
}

这里,我们将字符串复制到一个可修改的缓冲区中,并将一个地址传递给它的第一个字符,原来的函数。< /p> 可以尝试<代码> GeAGE((char *)“hello”)< /> > < /p> C++,你可以这样写,

void getAge(字符串名称)
{
//做点什么
}

并且还包括头文件
#include
,因为您现在正在使用string

最安全的方法是复制字符串,然后调用C函数:

void getAgeSafe(const char* name)
{
  std::vector<char> tmp = name?
    std::vector<char>(name, name+1+strlen(name))
    :std::vector<char>();

  getAge( tmp.data() );
}
void getAgeUnsafe(const char* name)
{
  getAge( const_cast<char*>(name) );
}

但这一次,这个名字更可怕,手术也是如此。如果调用一个编译时常数字符串,如“代码> > Bob”<代码>,如果<代码> GATAGE < /CU>修改它的输入,未定义的行为结果(这在C和C++中都是正确的C++至少警告你).< /P>使函数参数a <代码> const char */COD> >不,它是由其他人定义的函数,不能改变在那种情况下,提出论点。在那种情况下,无论是谁在做这件事,都要和他们讨论。不管怎样,当指针不在函数中更改时,您应该在一个体面的C编译器中得到一个警告,然后应该使用
const char*
定义它。请求“其他人”进行相应的更改,因为这是一种很好的做法void getAge()方法不能changed@nouney,问题中尚未说明“无法更改”信息,但仅在注释中说明。前提是您知道函数不会尝试修改字符串。而且你应该使用C++的casest.@ EricPostpischil,“复制字符串”意味着什么,否则。<代码> CyString()/Curr>返回一个<代码> const char */COD> >,这样你会得到同样的警告。传递
&name[0]
将起作用。@GuyGreer-oops,已修复。对于
std::string
,甚至
data()
也是
const
,因此构建了
std::vector
的缓冲区。(我不确定标准是否保证
&name[0]
以空结尾?@Yakk这是在C++11中的问题(以前也没有空结尾的问题–存储的连续性是)。在我看来,您当前的代码是不必要的复杂;只需使用适当的构造函数初始化向量(当然这会使空检查变得不可能或至少更难)。@KonradRudolph Bah,将字符串读两遍,一次找到结尾,另一次复制到
std::vector
?我想这确实节省了重新分配的费用。
void getAgeUnsafe(const char* name)
{
  getAge( const_cast<char*>(name) );
}