私はGCCの拡張子__attribute__((cleanup))
は、少なくともいくつかのケースでは良いアイデアだと思うが、私はそれを使用する方法を見つけることができませんいい意味で。私がやっていることは、まだ本当に迷惑に見える。GCCとclang __attribute __((クリーンアップ))とポインタ宣言を使用する良いと慣用方法
私はあまり型に#define _cleanup_(x) __attribute__((cleanup(x))
をやって多くのコードを見ましたが、そこなどfree
またはclosedir
、fclose
、などの標準関数を渡すことが方法はありますか?
私はちょうど書くことはできません見ての通り:、かなり迷惑なんだ
static void free_char(char **ptr) { free(*ptr); }
__cleanup__((free_char)) char *foo = malloc(10);
:クリーンアップコールバックがchar**
ポインタを受け取ることになりますので
__attribute__((cleanup(free))) char *foo = malloc(10);
、と私はいつものようなものを記述する必要があります最も厄介な部分は、あなたが必要とするすべてのタイプに対してこのようなクリーンアップ関数を定義することです。なぜなら、明らかにそれをvoid **
のために定義することはできないからです。これらの事を避ける最善の方法は何ですか?
あなたは '__attribute __((cleanup))'が**良いアイデアではないと言ってもいいでしょう。 – user3386109
デストラクタが必要な場合は、デストラクタを見つける場所を知っています。 –
@ user3386109、それは良いアイデアだと思いますが、実現は少し壊れています。あるいは、私が理解できないものがあるかもしれないので、私はそれを求めています。 – coredump