错误C2440:'=':无法从'const char *'转换为'char *'

时间:2013-05-01 16:14:00

标签: visual-c++

我花了很多时间在这里寻找有关显然是一个常见错误的帮助,但我所看到的似乎都不适合我的情况。

我正在将一个用Visual Studio 6 C ++编写的旧的源代码程序迁移到Visual Studio 2012,幸运的是,因为我不是C ++程序员(只是一个卑微的VB和C#开发人员)。迁移向导和Internet帮助我找到并更正了向导无法处理的代码。

在这个代码块中,我认为只是创建一个目录

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 个答案:

答案 0 :(得分:3)

也许在这一行......

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

pszLastSlash不是常数,但pszDir是常量。 strrchr()有两个def(参见http://www.cplusplus.com/reference/cstring/strchr/)...

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

因为你输入一个常量char *,它会尝试使用返回const char *的def,但是你将它赋给一个非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,那么这就解释了为什么您现在看到错误。

答案 1 :(得分:0)

此行

*pszLastSlash = '\0';

正在修改传递给你的函数的缓冲区,你不能答应你的调用者你不会修改缓冲区。因此

int CreateAllDirectories(char* pszDir);

是正确的签名

答案 2 :(得分:0)

您可以尝试在

中添加新内容
pszLastSlash = strrchr( pszDir, '\' );

所以,它将是

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