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?