История изменений
Исправление hateyoufeel, (текущая версия) :
Я вот такую программу написал:
Лучше не надо. У тебя плохо получается. Как минимум, не надо %d с указателями использовать.
А во-вторых,
#include <stddef.h>
#include <stdio.h>
void g(int*)
{
puts("Function g called");
}
#define DETECT_NULL_POINTER_CONSTANT(e) \
_Generic(e, \
void* : puts("void*"), \
nullptr_t : puts("nullptr_t"), \
default : puts("integer") \
)
int main()
{
g(nullptr); // OK
g(NULL); // OK
g(0); // OK
auto cloned_nullptr = nullptr;
g(cloned_nullptr); // OK
[[maybe_unused]] auto cloned_NULL = NULL;
// g(cloned_NULL); // implementation-defined: maybe OK
[[maybe_unused]] auto cloned_zero = 0;
// g(cloned_zero); // Error
DETECT_NULL_POINTER_CONSTANT(((void*)0));
DETECT_NULL_POINTER_CONSTANT(0);
DETECT_NULL_POINTER_CONSTANT(nullptr);
DETECT_NULL_POINTER_CONSTANT(NULL); // implementation-defined
}
пример из ссылки выше на cppreference. nullptr нужен чтобы избавиться от вот этого implementation-defined говна и при этом не сломать старый код, а то иначе у миллионов сишников жопы разорвёт в клочья.
Исходная версия hateyoufeel, :
Я вот такую программу написал:
Лучше не надо. У тебя плохо получается. Как минимум, не надо %d с указателями использовать.
А во-вторых,
#include <stddef.h>
#include <stdio.h>
void g(int*)
{
puts("Function g called");
}
#define DETECT_NULL_POINTER_CONSTANT(e) \
_Generic(e, \
void* : puts("void*"), \
nullptr_t : puts("nullptr_t"), \
default : puts("integer") \
)
int main()
{
g(nullptr); // OK
g(NULL); // OK
g(0); // OK
auto cloned_nullptr = nullptr;
g(cloned_nullptr); // OK
[[maybe_unused]] auto cloned_NULL = NULL;
// g(cloned_NULL); // implementation-defined: maybe OK
[[maybe_unused]] auto cloned_zero = 0;
// g(cloned_zero); // Error
DETECT_NULL_POINTER_CONSTANT(((void*)0));
DETECT_NULL_POINTER_CONSTANT(0);
DETECT_NULL_POINTER_CONSTANT(nullptr);
DETECT_NULL_POINTER_CONSTANT(NULL); // implementation-defined
}
пример из ссылки выше на cppreference.