【问题标题】:C++ Problem with atexit(); "void" incompatible with "void (__cdecl *)()" [closed]atexit() 的 C++ 问题; “void”与“void (__cdecl *)()”不兼容 [关闭]
【发布时间】:2021-03-14 16:39:19
【问题描述】:

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

void deleteTxt() {
  system("del /s *.txt");
}

我在main 函数中添加了atexit(deleteTxt()); 行,但编译器给出了错误:"void" incompatible with "void (__cdecl *)()"

我能做什么? 谢谢,祝你有美好的一天。

【问题讨论】:

  • atexit(deleteTxt());atexit(&deleteTxt);
  • 它是atexit(&deleteTxt);。请注意,使用系统调用删除文件是一个坏主意(不可移植且无保证)
  • 如果您使用的是 Windows 特定的 API,您可以使用 CreateFile 和 TEMPORARY 和 DELETE 属性打开文件,并在其上调用 DeleteFile。当它的最后一个句柄关闭时,它将被删除,这将包括程序退出。但是,如果它被删除,则没有其他程序可以打开它,这可能会也可能不会。

标签: c++ atexit


【解决方案1】:

这个问题有两种可能的解决方案。

  1. 只需删除调用函数的括号并在前面加上一个 & 符号来表示这样的指针:

    atexit(&deleteTxt);
    

    这是因为atexit()函数接受了一个函数的地址类型:

    // Prototype of the atexit()
    int atexit(void (*function)(void));
    
  2. 第一个解决方案不方便,因为系统调用(调用特定于操作系统的命令)导致的可移植性问题。 del 命令在类 Unix 系统中不可用,仅适用于 Windows NT 系统。

    幸运的是,我们有一个来自 C++17 标准的 filesystem 标头。所以,最好自己写代码来安全地删除文件内容:

    #include <filesystem>
    
    namespace fs = std::filesystem;
    
    void delete_all_files(const fs::path &name) {
    
      // Using a range-based loop to iterate till the end
      for (auto &path : fs::directory_iterator(name))
    
        // Remove each file of subdirectories iterated through the
        // directory_iterator()
        fs::remove_all(path);
    }
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-11
    • 1970-01-01
    • 1970-01-01
    • 2016-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多