当前位置: C语言 -- 标准库 -- <stddef.h> -- nullptr_t

nullptr_t类型


概要:
#include <stddef.h>
typedef typeof_unqual(nullptr) nullptr_t;

描述:

nullptr_t类型是预定义常量nullptr的类型。该类型仅在区分nullptr与其它表达式类型的时候具有非常有限的用途。该类型是无限定的完整标量类型(unqualified complete scalar type);该类型不同于指针类型,也不同于算术类型;该类型不是原子类型,也不是数组类型,该类型只有一个值nullptr。该类型对象的默认初始化或者空初始化等价于使用nullptr初始化。

nullptr_t类型的大小和对齐方式与指向字符类型的指针相同。nullptr类型值的对象表示与void*类型空指针值的对象表示相同。对于具有此类对象表示的nullptr_t类型对象,其左值转换结果为nullptr;如果对象表示不同,其行为是未定义的。在整个程序执行期间,nullptr_t类型对象值评估为nullptr。


由于nullptr_t类型视为是标量类型,所以可以出现在(void *)0有效的上下文中,例如:

-- 作为alignas、sizeof、typeof运算符的操作数。

-- 作为隐式或者显式转换为指针类型的操作数。

-- 作为nullptr_t类型对象赋值或者初始化时的赋值表达式。

-- 作为nullptr_t类型参数的实参或者出现在可变参数列表中。

-- 作为void表达式。

-- 作为隐式或者显式转换为bool类型的操作数。

-- 作为_Generic主表达式的操作数。

-- 作为!、&&、||、条件运算符的操作数。

-- 作为if语句或者迭代语句的控制表达式。


范例:
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
/*类型nullptr_t范例*/

#include <stddef.h>
#include <stdio.h>

/*确定表达式的类型。*/
#define TYPE(x) _Generic((x), \
    int: "int type", \
    double: "double type", \
    nullptr_t: "nullptr_t type", \
    default: "unknown type" \
)

int main(void)
{
    printf("The type of nullptr is %s.\n", TYPE(nullptr));

    return 0;
}


可能输出:

The type of nullptr is nullptr_t type.

(注:编译时实现未支持nullptr_t类型。)


相关内容:
ptrdiff_t 表示指针相减结果的类型。
max_align_t 最大基本对齐的对象类型。
wchar_t 宽字符类型。
size_t 表示sizeof运算符运算结果的无符号整数类型。


主要参考资料:

1、ISO/IEC 9899:2024