![](/img/trans.png)
[英]C++: deprecated conversion from string constant to 'LPSTR {aka char*}' [-Wwrite-strings] - warning. How to avoid?
[英]How to avoid deprecated conversion from string constant to 'char*' in C++
我想在C ++中調用以下代碼,我無法更改:
void getAge(char *name)
{
// do something
}
當我用getAge("hello");
調用它時getAge("hello");
,它有以下警告:
warning: deprecated conversion from string constant to 'char*'
但C代碼中沒有警告。 有什么區別,如何更改調用以避免C ++中的警告?
功能[...]無法更改
然后在函數周圍寫一個包裝器並復制字符串 - 或者,如果你覺得幸運(=你知道字符串不會在原始函數中修改),顯式拋棄const-ness:
void getAge(char const* name) {
the_namespace::getAge(const_cast<char*>(name));
}
如果您不確定該函數是否修改了它的參數,請使用類似下面的內容 - 但是,如果是這種情況,那么使用字符串文字( getAge("hello")
)調用該函數無論如何都是無效的。
void getAge(char const* name) {
std::string buffer(name);
the_namespace::getAge(&buffer[0]);
}
在這里,我們將字符串復制到一個可修改的緩沖區,並將一個地址傳遞給它的第一個字符到原始函數。
最安全的方法是復制字符串,然后調用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() );
}
並從您的C ++代碼調用getAgeSafe
。
依賴於C代碼從不修改char* name
一種不太安全的方法是const_cast
,再次在“包裝”函數中:
void getAgeUnsafe(const char* name)
{
getAge( const_cast<char*>(name) );
}
但這次的名字更加可怕,操作也是如此。 如果用類似"bob"
的編譯時常量字符串調用getAge
,如果getAge
修改了它的輸入,則會getAge
未定義的行為(在C和C ++中都是如此 - C ++至少會警告你)。
你可以嘗試getAge((char*)"hello")
。
在c ++中你可以這樣寫, void getAge(string name) { // do something }
並且還包含頭文件#include<string>
因為你現在正在使用string
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.