2013-05-01 113 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, '\'); 
相关问题