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 编程语言中使用析构函数?