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;
}
我认为这很好,可以有趣的用法。例如,如果将它与堆栈数据结构相结合,您可以直接在源代码中声明非常直观和可读的树结构:
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);
}
但是当然这个hack不像真正的析构函数那样工作。如果您在块中使用break
或return
语句,则不会调用fclose
。但是,如果您需要像C ++中的continue
语句那样打破块,则可以使用break
语句。 :-)所以也许这个技巧可以通过一些宏魔法来改进,几乎就像真正的析构函数一样。
所以问题是:
是否可以在标准C编程语言中使用析构函数?