编译器坚持 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*);

但是如果 oldnamenewnamestd::(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 状态代码,而是在出现错误时抛出异常。