哪个 windows.h 标头定义了 NULL?

ilo*_*ang -6 c

我必须编写一些Windows代码,并且我想尽可能将其与Linux部分分开。

在某一时刻,我需要检查 Windows 代码中的 NULL,但我不想包含stdio.hor stdlib.h

我强烈怀疑 NULL 是在 中的某处定义的windows.h,但我找不到该页面。我发现了这个,这很有趣,但没有告诉我我想知道什么。

Lun*_*din 8

NULL在标准 C 标头中定义stddef.h,句点。

例如,如果您在 Windows 中运行 gcc/mingw port,您可以告诉任何不太好的 IDE 找到 的声明NULL并最终到达stddef.h它所说的位置#define NULL ((void *)0)

您还可以创建一个源文件,如下所示:

// main.c
#include <windows.h>
int main (void)
{}
Run Code Online (Sandbox Code Playgroud)

然后用 进行编译gcc main.c -H。这将扩展所有标头依赖项,因此您将看到哪个标头包含其他标头。您会看到一大堆它们,并且您会注意到它们stddef.h间接包含在大约 2-3 个不同的位置。

结论:NULL不是由 windows.h 或您应该直接包含的任何其他 Windows 特定标头定义的

如果您需要使用NULL,那么正确的做法是#include <stddef.h>无论操作系统如何。

  • @iloveclang 好的,是的,Minwindef.h 中存在一些可能定义 NULL 的情况,但前提是某些 `#if WINAPI_FAMILY_PARTITION (WINAPI_PARTITION_APP)` 为 true 并且 NULL 尚未定义。通过检查预处理器输出,您可以看到 NULL 的定义不是来自 Minwindef.h,而是来自 stddef.h,假设您包含了 windows.h。但这都是编译器内部的事情,而不是我们应该担心的事情。在那里定义 NULL 的目的不是让应用程序程序员假设这是要包含的标头,而是出于某些内部兼容性原因。 (2认同)