带有AtExt()的C++问题;“void”与“void(u cdecl*)()”不兼容
我想在程序关闭时删除可执行文件所在文件夹中的所有.txt文件。 要删除文件,我使用systemdel/s*.txt;,但我想在程序关闭时做,所以我做了一个void函数带有AtExt()的C++问题;“void”与“void(u cdecl*)()”不兼容,c++,atexit,C++,Atexit,我想在程序关闭时删除可执行文件所在文件夹中的所有.txt文件。 要删除文件,我使用systemdel/s*.txt;,但我想在程序关闭时做,所以我做了一个void函数 void deleteTxt() { system("del /s *.txt"); } 我添加了一行atexitdeleteTxt;在main函数中,但编译器给出错误:void与void\uu cdecl不兼容* 我能做什么? 谢谢,祝您愉快。这个问题有两种可能的解决方案 只需删除调用函数的括号,并在括
void deleteTxt() {
system("del /s *.txt");
}
我添加了一行atexitdeleteTxt;在main函数中,但编译器给出错误:void与void\uu cdecl不兼容*
我能做什么?
谢谢,祝您愉快。这个问题有两种可能的解决方案 只需删除调用函数的括号,并在括号前加上一个符号,表示如下指针:
atexit(&deleteTxt);
这是因为atexit函数接受函数的地址类型:
// Prototype of the atexit()
int atexit(void (*function)(void));
第一种解决方案不方便,因为系统调用特定于操作系统的命令会导致可移植性问题。del命令在类Unix系统中不可用,仅适用于Windows NT系统
幸运的是,我们有一个来自C++17标准的文件系统头。因此,最好编写自己的代码以安全地删除文件内容:
包括
名称空间fs=std::filesystem;
void delete_all_fileconst fs::path&name{
//使用基于范围的循环进行迭代直到结束
自动路径:fs::directory\u iteratorname(&P)
//删除遍历的每个子目录文件
//目录迭代器
fs::删除所有路径;
}
atexitdeleteTxt;≠ atexit&deleteTxt;它是atexit&deleteTxt;。请注意,使用系统调用删除文件是一个坏主意,不可移植,也不保证。如果您使用的是Windows特定的API,则可以使用CreateFile和TEMPORARY和DELETE属性打开该文件,并对其调用DeleteFile。当它的最后一个句柄关闭时,它将被删除,这将包括程序退出。但是,如果它被删除,没有其他程序可以打开它,这可能是正常的,也可能是不正常的。