C разрешает NULL определять любую константу нулевого указателя, другими словами, любое целочисленное выражение константы, которое оценивается в 0, или такое выражение, отлитое от void *. Мой вопрос касается того, действительно ли имеет значение выбор определения, то есть зависит от того, будет ли в противном случае правильная программа зависеть от того, какое определение используется. Для целей этого вопроса я хотел бы игнорировать такие проблемы, как NULL, передаваемый на переменные функции или функции, лишенные прототипов, поскольку я уже рассматривал их отдельно. Предположим sizeof NULL == sizeof(void *) и sizeof NULL == sizeof(T) для некоторого целочисленного типа T, так что sizeof недостаточно, чтобы ответить на вопрос, имеет ли тип NULL тип указателя.
Очевидно, что C11 позволяет различать тип NULL или любое другое выражение: ключевое слово _Generic.
C99 также обеспечивает один неясный способ, который кажется надежным:
int null_has_ptr_type()
{
char s[1][1+(int)NULL];
int i = 0;
return sizeof s[i++], i;
}
Существуют ли какие-либо другие методы, с помощью которых тип NULL может быть определен с помощью соответствующей программы C? Любая работа в C89?