簡體   English   中英

如何避免在C ++中不推薦將字符串常量轉換為'char *'

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM