编译器坚持 rename() 函数的类型为 void
Compiler insists rename() function is of type void
我正在尝试编写一个能够重命名文件的程序,但我遇到了一个奇怪的问题。
当我写这个时:
string oldname, newname;
rename(oldname, newname);
一切正常。该文件已重命名,没有问题。
但是当我继续尝试这个时:
int result;
result = rename(oldname, newname);
if(result)
//stuff
else
//other stuff
“=”有一条新的红色下划线,我收到一条错误消息“无法将类型为“void”的值分配给类型为“int”的实体”。
我也试过了
if(rename(oldname, newname))
//stuff
然后我得到“表达式必须有 bool 类型(或可转换为 bool)”
Microsoft 的文档说重命名函数 returns 如果成功则为 0,如果不成功则为非零。经过大量谷歌搜索后,我发现无数使用第二个或第三个片段的代码示例没有问题,其中 none 帮助我理解了我的情况可能有什么不同。语言标准是C++17。我想不出任何其他相关细节,但为了以防万一,这里有一段包含所有“包含”的实际代码:
#include <windows.h>
#include <stdlib.h>
#include <tchar.h>
#include <vector>
#include <string>
#include <filesystem>
#include <fstream>
#include <time.h>
#include <iostream>
#include <codecvt>
#include <locale>
#include <sstream>
#include <windowsx.h>
#include <Shlobj.h>
using namespace std;
using namespace std::filesystem;
tmp_wstr = oldname + L"\n\nwill be renamed to:\n\n" + newname + L"\n\nWould you like to proceed?";
msgboxID = MessageBox(NULL, tmp_wstr.c_str(), L"Renaming...", MB_YESNO | MB_SYSTEMMODAL);
switch (msgboxID)
{
case IDYES:
result = rename(oldname, newname);
if (result)
{
error = true;
msgboxID = MessageBox(NULL, L"Unable to rename", NULL, MB_OK | MB_SYSTEMMODAL);
}
else
error = false;
break;
case IDNO:
error = true;
break;
}
这里oldname和newname是wstring而不是string,但是我试过用string还是报错
您希望调用带有签名的 C 标准库函数rename()
:
int rename(const char*, const char*);
但是如果 oldname
和 newname
是 std::(w)string
类型,那么该函数将不是 rename(oldname, newname)
的可行重载,因为 std::(w)string
不是隐式的可转换为 const char*
.
因此,您必须调用另一个名为 rename()
的函数。由于您使用了:
using namespace std::filesystem;
实际上,您正在调用 C++ 标准库函数的以下重载 std::filesystem::rename()
,签名为:
void rename(const std::filesystem::path&, const std::filesystem::path&);
你的论点是可行的,因为 std::filesystem::path
可以从 std::(w)string
.
构造
这个函数有一个void
return类型,解释错误信息。如 link 中所述,它没有 return 状态代码,而是在出现错误时抛出异常。
我正在尝试编写一个能够重命名文件的程序,但我遇到了一个奇怪的问题。 当我写这个时:
string oldname, newname;
rename(oldname, newname);
一切正常。该文件已重命名,没有问题。 但是当我继续尝试这个时:
int result;
result = rename(oldname, newname);
if(result)
//stuff
else
//other stuff
“=”有一条新的红色下划线,我收到一条错误消息“无法将类型为“void”的值分配给类型为“int”的实体”。 我也试过了
if(rename(oldname, newname))
//stuff
然后我得到“表达式必须有 bool 类型(或可转换为 bool)”
Microsoft 的文档说重命名函数 returns 如果成功则为 0,如果不成功则为非零。经过大量谷歌搜索后,我发现无数使用第二个或第三个片段的代码示例没有问题,其中 none 帮助我理解了我的情况可能有什么不同。语言标准是C++17。我想不出任何其他相关细节,但为了以防万一,这里有一段包含所有“包含”的实际代码:
#include <windows.h>
#include <stdlib.h>
#include <tchar.h>
#include <vector>
#include <string>
#include <filesystem>
#include <fstream>
#include <time.h>
#include <iostream>
#include <codecvt>
#include <locale>
#include <sstream>
#include <windowsx.h>
#include <Shlobj.h>
using namespace std;
using namespace std::filesystem;
tmp_wstr = oldname + L"\n\nwill be renamed to:\n\n" + newname + L"\n\nWould you like to proceed?";
msgboxID = MessageBox(NULL, tmp_wstr.c_str(), L"Renaming...", MB_YESNO | MB_SYSTEMMODAL);
switch (msgboxID)
{
case IDYES:
result = rename(oldname, newname);
if (result)
{
error = true;
msgboxID = MessageBox(NULL, L"Unable to rename", NULL, MB_OK | MB_SYSTEMMODAL);
}
else
error = false;
break;
case IDNO:
error = true;
break;
}
这里oldname和newname是wstring而不是string,但是我试过用string还是报错
您希望调用带有签名的 C 标准库函数rename()
:
int rename(const char*, const char*);
但是如果 oldname
和 newname
是 std::(w)string
类型,那么该函数将不是 rename(oldname, newname)
的可行重载,因为 std::(w)string
不是隐式的可转换为 const char*
.
因此,您必须调用另一个名为 rename()
的函数。由于您使用了:
using namespace std::filesystem;
实际上,您正在调用 C++ 标准库函数的以下重载 std::filesystem::rename()
,签名为:
void rename(const std::filesystem::path&, const std::filesystem::path&);
你的论点是可行的,因为 std::filesystem::path
可以从 std::(w)string
.
这个函数有一个void
return类型,解释错误信息。如 link 中所述,它没有 return 状态代码,而是在出现错误时抛出异常。