NULL 与 RT_NULL 的区别
1. 核心区别
两者的核心区别是类型安全。
1.1 NULL
宏定义为 #define NULL ((void *)0),这是一个指针类型的常量。它明确告诉编译器:“这是一个空指针”。由于它被强制转换为 void *,如果你试图将其赋值给一个整数变量,编译器通常会发出警告。它是 C 语言中表示空指针的标准方式。
1.2 RT_NULL
宏定义为 #define RT_NULL (0),这是一个整数类型的常量。在 C 语言中,数值 0 在指针上下文中可以被隐式转换为指针,但在逻辑上它首先是一个 int。
2. 对比
在 C++ 中,void * 不能像 C 语言那样隐式转换为其他类型的指针。如果你在 C++ 代码里使用 ((void *)0),编译器会报错。因此,在 C++ 早期标准中,习惯直接用 0 来表示空指针。RT-Thread 为了保证同一套头文件在 C 和 C++ 环境下都能编译通过,往往更倾向于使用这种定义。
| 特性 | NULL | RT_NULL |
|---|---|---|
| 标准出处 | C 标准库 (stdio.h, stddef.h) |
RT-Thread 内核定义 |
| 跨语言兼容 | C | C / C++ |
| 编译器警告 | 较严格,不容易混淆指针与整数 | 较宽松 |
3. 注意事项
C++ 函数重载:如果你有一个函数
foo(int)和foo(char*),调用foo(RT_NULL)会匹配到int版本;代码规范:在 RT-Thread 的生态里,建议统一使用
RT_NULL。这不仅是为了风格统一,也是为了确保内核组件的移植性;
NULL 与 RT_NULL 的区别
https://flowerdown.org/posts/20250903-183758