Ноль
Если вы чувствуете, что просто обязаны определить NULL, воспользуйтесь const int NULL=0;
Суть данного совета в том, что согласно определению языка не существует контекста, в котором (определенное в заголовочном файле) значение NULL было бы корректным, в то время как просто 0 -- нет.
Исходя из того же определения, передача NULL в функции с переменным количеством параметров вместо корректного выражения вида static_cast<SomeType*>(0) запрещена.
Безусловно, все это правильно, но на практике NULL в функции с переменным количеством параметров все же передают. Например, так: #include <stdio.h> #include <stdarg.h> #include <stdlib.h>
void error(int stat ...) { va_list ap; va_start(ap, stat);
while (const char* sarg=va_arg(ap, const char *)) printf("%s", sarg);
va_end(ap); exit(stat); }
int main() { error(1, "Случилось ", "страшное", NULL); // внимание, ошибка! // вместо NULL нужно использовать // static_cast<const char *>(0) }
Именно для поддержки подобного рода практики (некорректной, но широко распространенной) реализациям разрешено определять NULL как 0L (а не просто 0) на архитектурах, где sizeof(void*)==sizeof(long)>sizeof(int).