Visual c++ 错误C2440:&x27=';:无法从';常量字符*';至';字符*';

Visual c++ 错误C2440:&x27=';:无法从';常量字符*';至';字符*';,visual-c++,Visual C++,我花了很多时间在这里寻找帮助,这显然是一个常见的错误,但我所看到的似乎都不适合我的情况 我正在迁移一个旧的外包的程序,它是用Visual Studio 6 C++写到Visual Studio 2012的,我很幸运,因为我不是C++程序员(只是一个低级的VB和C开发人员)。迁移向导和internet在帮助我查找和更正向导无法处理的代码方面帮了大忙 在这个代码块中,我相信它只不过是创建了一个目录 int CreateAllDirectories(const char* pszDir) { char

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

<>我正在迁移一个旧的外包的程序,它是用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,“\”)的结果分配给变量pszlastsslash时会生成错误。从这段代码的其余部分来看,它看起来像pszLastSlash=strrchr(pszDir,“\”);是一个有效的表达式

是双反斜杠的问题,在我看来,双反斜杠和转义序列是一样的。

也许在这一行中

pszLastSlash = strrchr( pszDir, '\\' );
pszLastSlash
不是常量,但
pszDir
是常量。
strrchr()
(请参阅)有两个def

因为您输入了一个常量char*,它将尝试使用返回常量char*的def,但您正在将其分配给一个非常量char*。我认为这就是造成你的错误的原因

因为
pszDir
是常量,所以返回给您的指针是常量,因为您不应该修改
pszDir
指向的内存区域

如果您已经自己分配了
pszDir
,并且您知道修改是安全的,那么您可以放松函数def中的常量约束吗?即

int CreateAllDirectories(char* pszDir)
但是,唯一要做的是
pszDir
是您拥有并可以修改的字符串:)

我刚才注意到C++引用页中…

In C, this function is only declared as:
    char * strchr ( const char *, int ); 
因此,如果您以前使用过C,那么这将解释为什么您现在会看到错误。

可能在这一行中

pszLastSlash = strrchr( pszDir, '\\' );
pszLastSlash
不是常量,但
pszDir
是常量。
strrchr()
(请参阅)有两个def

因为您输入了一个常量char*,它将尝试使用返回常量char*的def,但您正在将其分配给一个非常量char*。我认为这就是造成你的错误的原因

因为
pszDir
是常量,所以返回给您的指针是常量,因为您不应该修改
pszDir
指向的内存区域

如果您已经自己分配了
pszDir
,并且您知道修改是安全的,那么您可以放松函数def中的常量约束吗?即

int CreateAllDirectories(char* pszDir)
但是,唯一要做的是
pszDir
是您拥有并可以修改的字符串:)

我刚才注意到C++引用页中…

In C, this function is only declared as:
    char * strchr ( const char *, int ); 
因此,如果您以前使用过C,那么这将解释为什么您现在会看到错误。

因为这一行

*pszLastSlash = '\0';
在修改传递到函数中的缓冲区时,不能向调用者保证不会修改缓冲区。所以

int CreateAllDirectories(char* pszDir);
这行之后的签名是否正确

*pszLastSlash = '\0';
在修改传递到函数中的缓冲区时,不能向调用者保证不会修改缓冲区。所以

int CreateAllDirectories(char* pszDir);

是正确的签名

你可以尝试在

中间放新单词。
pszLastSlash = strrchr( pszDir, '\' );
因此,它将是

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

<>你可以尝试在

中引入新的
pszLastSlash = strrchr( pszDir, '\' );
因此,它将是

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

是的,这就是答案。您还可以建议将
const char*pszDir
更改为
char*pszDir
,因为它可以在函数内部更改。或者复制一份。因此,您建议他尝试更改
CreateAllDirectories()
上的
pszDir
参数以获得缓解?@Soon:谢谢您的评论,已更新。我认为他只有在知道写信是安全的情况下才应该改变pszDir的常数…@Jimbo:他已经假设了,因为他正在写信给它。@Ben,说得好,是的。鉴于func def是const,这意味着他也认为自己不会,因此存在一些困惑。。我认为这是值得仔细检查的,尽管正如你所说,最有可能的情况是,他可以写信给它,并且确实想这样做。是的,这就是答案。您还可以建议将
const char*pszDir
更改为
char*pszDir
,因为它可以在函数内部更改。或者复制一份。因此,您建议他尝试更改
CreateAllDirectories()
上的
pszDir
参数以获得缓解?@Soon:谢谢您的评论,已更新。我认为他只有在知道写信是安全的情况下才应该改变pszDir的常数…@Jimbo:他已经假设了,因为他正在写信给它。@Ben,说得好,是的。鉴于func def是const,这意味着他也认为自己不会,因此存在一些困惑。。我认为这是值得仔细检查的,尽管很可能是这样的,正如你所说,他可以写信给它并且确实想这样做。