参照が null になるオブジェクトを C で定義するにはどうすればよいでしょうか?
// definition of foo
...
void * bar = &foo; // bar must be null
それを行う方法はいくつかありますが、私のニーズに合うものはありません。
__attribute__((weak)) extern int foo; //not working with cygwin/gcc 3.4
__attribute__((at(0))) int foo; //only with rvds
#define foo (*(int*) 0) //cannot be embedded in a macro
実際、私は標準準拠のソリューション (c99) を好みますが、動作するものは何でも問題ありません。
編集済み:これを行う理由は、バーが常に null になるとは限らないためです。より適切な例を次に示します。
// macro that will define foo to a real object or to *null
DECL(foo);
int * bar = &foo;
if(bar) {
// we can call func
func(bar);
} else {
// bar undefined
exit(-1);
}
もちろん、これはまだあまり関連性がありません。条件で #if を使用できるからです。プロジェクトには、実際には大きな構造、多くのファイル、いくつかのコンパイラ、いくつかの cpu ターゲット、および使用する構文の複雑さに指数関数的になる確率でバグを生成する多くのプログラマが含まれます。単純なマクロで foo オブジェクトを宣言したいのはそのためです。