少し注意が必要ですが、ポインタ型からポインタ型に変換するだけの場合は、ここでプリプロセッサを利用できます。
#define cv_cast(TYPE,expr) (*((TYPE)(expr)) = *(expr),(TYPE)(expr))
使用法:
typedef struct {
float f;
} Foo;
typedef struct {
char b;
} Bar;
void somefunction(void) {
Foo f; Bar b;
Foo volatile* foov = &f;
Foo* foo = 0;
Bar* bar = &b;
foo = cv_cast(Foo*,foov); // legal (no error, no warning)
foov = cv_cast(Foo*,foo); // legal (no error, no warning)
foo = cv_cast(Foo*,bar); // illegal (an error)
}
ここでの基本的なトリックは、fromからBar
toへの割り当てを強制することです。これは、の後の部分で行われます。互換性のないポインタ型をキャストしている場合にのみ、エラーがトリガーされます。Foo
cv_cast
Bar*
Foo*
,
ただし、cv_cast
無効な場所(たとえばNULL
)を指すポインタを使用すると、segfaultが発生することに注意してください。
注:(コメント内の)参照用に、この投稿nullfn
では以前は不要なヘルパー関数を使用していました。興味があれば、履歴で調べることができます。