首页 > 解决方案 > stddef.h 中的 NULL 定义

问题描述

我在我的电脑中发现了两个同名的头文件,内容不同:

/usr/src/linux-headers-4.19.0-13-common/include/uapi/linux/stddef.h
/usr/src/linux-headers-4.19.0-13-common/include/linux/stddef.h

为什么这些文件位于不同的文件夹中并且具有不同的内容?

创建 C++ 应用程序时应该使用哪个带有标题的文件夹?

第一个文件:/usr/src/linux-headers-4.19.0-13-common/include/uapi/linux/stddef.h

内容:

#ifndef _LINUX_STDDEF_H
#define _LINUX_STDDEF_H

#include <uapi/linux/stddef.h>

#undef NULL
#define NULL ((void *)0)

enum {
    false   = 0,
    true    = 1
};

#undef offsetof
#ifdef __compiler_offsetof
#define offsetof(TYPE, MEMBER)  __compiler_offsetof(TYPE, MEMBER)
#else
#define offsetof(TYPE, MEMBER)  ((size_t)&((TYPE *)0)->MEMBER)
#endif

/**
 * sizeof_field(TYPE, MEMBER)
 *
 * @TYPE: The structure containing the field of interest
 * @MEMBER: The field to return the size of
 */
#define sizeof_field(TYPE, MEMBER) sizeof((((TYPE *)0)->MEMBER))

/**
 * offsetofend(TYPE, MEMBER)
 *
 * @TYPE: The type of the structure
 * @MEMBER: The member within the structure to get the end offset of
 */
#define offsetofend(TYPE, MEMBER) \
    (offsetof(TYPE, MEMBER) + sizeof_field(TYPE, MEMBER))

#endif

第二个文件:

/usr/src/linux-headers-4.19.0-13-common/include/linux/stddef.h

内容:

/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
#include <linux/compiler_types.h>

#ifndef __always_inline
#define __always_inline inline
#endif

标签: clinux

解决方案


推荐阅读