Cを使用NULLすると、任意のnullポインター定数、つまり、0と評価される任意の整数定数式、またはにキャストされるそのような式を定義できますvoid *。私の質問は、定義の選択が本当に重要かどうか、つまり、そうでなければ正しいプログラムがどの定義が使用されているかに依存するかどうかに関するものです。NULLこの質問では、可変個引数関数やプロトタイプがない関数に渡されるなどの問題は、すでに個別に扱っているので無視したいと思います。と仮定sizeof NULL == sizeof(void *)しsizeof NULL == sizeof(T)て、ある整数型については、ポインタ型があるかどうかの質問に答えるには十分Tではありません。sizeofNULL
明らかに、C11は、キーワードのタイプNULLまたはその他の式を区別する方法を提供します。_Generic
C99はまた、信頼できると思われる1つのあいまいな方法を提供します。
int null_has_ptr_type()
{
char s[1][1+(int)NULL];
int i = 0;
return sizeof s[i++], i;
}
NULL準拠するCプログラムによってタイプを判別できる他の方法はありますか?C89で機能するものはありますか?