C中的析构函数?

use*_*061 5 c c++ destructor

C++ 有很好的特性,允许在块的末尾调用一些代码 - 析构函数。昨天我随机发现了一个技巧,它在 C 中的工作原理类似于 C++ 中的析构函数。为了说明,这里是使用这个技巧来自动关闭文件:

#include <stdio.h>

#define AUTO_FILE( id, name, access ) \
for ( FILE* id = fopen( name, access ); id != NULL; fclose( id ), id = NULL )

int main()
{
    AUTO_FILE( f, "hello.txt", "w" ) {
        fprintf( f, "Hello World!" );
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我认为这很好,可以有有趣的用法。例如,如果你将它与堆栈数据结构结合起来,你可以直接在源代码中声明非常直观和可读的树结构:

frame("frm") {
    menu("mnu") {
        popupmenu("file", "File") {
            menuitem("exit", "Exit");
        }
        popupmenu("help", "Help") {
            menuitem("about", "About...");
        }
    }
    label("lbl", "Hello World!");
    button("btn", "Push me!", btn_onclick);
}
Run Code Online (Sandbox Code Playgroud)

但是当然这个 hack 不像真正的析构函数那样工作。如果在块内使用breakorreturn语句,fclose将不会被调用。但是,continue如果您需要像breakC++ 中的with语句那样中断块,则可以使用statement 。:-) 所以也许这个技巧可以通过一些宏魔法来改进,就像真正的析构函数一样工作。

所以问题是:

是否可以在标准 C 编程语言中使用析构函数?