2013-05-01 134 views
0

我在這裏花了很多時間尋找關於顯然是一個常見錯誤的幫助,但沒有一個我見過似乎適合我的情況。錯誤C2440:'=':無法從'const char *'轉換爲'char *'

我正在將用Visual Studio 6 C++編寫的舊外源程序遷移到Visual Studio 2012,幸運的是我不是C++程序員(只是一個低級的VB和C#開發人員)。遷移向導和互聯網對幫助我找到並更正向導無法處理的代碼非常有幫助。

在該代碼塊我相信這是什麼都不做不是創建一個目錄

int CreateAllDirectories(const char* pszDir) 
{ 
char* pszLastSlash; 
char cTmp; 


if(_access(pszDir, 0) != -1) { 
    // it already exists 
    return 0; 
} 

pszLastSlash = strrchr(pszDir, '\\'); 
if (pszLastSlash) { 
    cTmp = *pszLastSlash; 
    *pszLastSlash = '\0'; 

    // try again with one less dir 
    CreateAllDirectories(pszDir); 

    *pszLastSlash = cTmp; 
} 

if (_mkdir(pszDir) == -1) { 
    return -1; 
} 

return 0; 

}

一個錯誤生成時strrchr的結果(pszDir,「\」)被分配給更變量pszLastSlash。從這段代碼的其餘部分看起來像pszLastSlash = strrchr(pszDir,'\');是一個有效的表達。

問題是雙反斜槓對我來說,看起來像和轉義序列。

回答

3

也許在這條線......

pszLastSlash = strrchr(pszDir, '\\'); 

pszLastSlash不是常數,而是pszDir是恆定的。有兩個DEFS爲strrchr()(見http://www.cplusplus.com/reference/cstring/strchr/)...

const char * strchr (const char * str, int character); 
     char * strchr (  char * str, int character); 

因爲你輸入一個常數的char *,它會嘗試使用返回一個const char *的高清,但你將其分配給非const char *。我認爲這就是產生你的錯誤的原因。

因爲pszDir是const,返回給你的指針是const,因爲你不應該修改pszDir指向的內存區域。

如果你自己分配了pszDir,你知道它是安全要修改,你可以在函數def中放鬆你的const限制嗎?即,

int CreateAllDirectories(char* pszDir) 

但是,只有做到這一點是pszDir是你自己的,並且可以修改:)

我只注意到在C++字符串引用頁面,...

In C, this function is only declared as: 
    char * strchr (const char *, int); 

所以,如果你以前使用C,那麼這就能解釋你爲什麼現在看到錯誤。

+2

是的,這就是答案。你也可以建議把'const char * pszDir'改成'char * pszDir',因爲它可以在函數內部改變。或者複製一份。 – soon 2013-05-01 16:21:27

+0

所以你建議他嘗試改變'CreateAllDirectories()'上的'pszDir'參數來獲得解脫? – 2013-05-01 16:21:42

+0

@Soon:感謝您的評論,更新。我認爲他應該只改變pszDir的常量,如果他知道可以安全地寫入... – Jimbo 2013-05-01 16:25:33

0

由於該行

*pszLastSlash = '\0'; 

被修改傳遞給你的函數的緩衝區,你不能保證你的來電者,你不會修改緩衝區。因此

int CreateAllDirectories(char* pszDir); 

是正確的簽名

0

您可以嘗試在中間投入新的

pszLastSlash = strrchr(pszDir, '\'); 

所以,這將是

:pszLastSlash = new strrchr(pszDir, '\'); 
相關問題