Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带有AtExt()的C++问题;“void”与“void(u cdecl*)()”不兼容_C++_Atexit - Fatal编程技术网

带有AtExt()的C++问题;“void”与“void(u cdecl*)()”不兼容

带有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不兼容* 我能做什么? 谢谢,祝您愉快。这个问题有两种可能的解决方案 只需删除调用函数的括号,并在括

我想在程序关闭时删除可执行文件所在文件夹中的所有.txt文件。 要删除文件,我使用systemdel/s*.txt;,但我想在程序关闭时做,所以我做了一个void函数

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。当它的最后一个句柄关闭时,它将被删除,这将包括程序退出。但是,如果它被删除,没有其他程序可以打开它,这可能是正常的,也可能是不正常的。