Я видел макрос ниже в самом верхнем заголовочном файле:
Вы не должны были видеть это, стандартная библиотека определяет его в <cstddef>
(и <stddef.h>
).И IIRC, в соответствии со стандартом, переопределение имен, определенных стандартными заголовочными файлами, приводит к неопределенному поведению.Так что с чисто стандартной точки зрения вы не должны этого делать.
Я видел, как люди делают следующее, по какой-то причине, о которой думал их разбитый ум:
struct X{
virtual void f() = NULL;
}
(Как в [неправильно]: «установить указатель виртуальной таблицы на NULL
»)
Это допустимо, только если NULL
определено как 0
, потому что = 0
является действительным токеном для чистого-виртуальные функции (§9.2 [class.mem]
).
Тем не менее, , если NULL
было правильно , использованным в качестве константы нулевого указателя, то ничто не должно прерываться.
Однако, имейте в виду, что, даже если, по-видимому, используется правильно, это изменится:
void f(int){}
void f(char*){}
f(0); // calls f(int)
f(nullptr); // calls f(char*)
Однако, если это когда-либо имело место, оно почти наверняка было сломано.