stddef.h头文件学习

stddef.h头文件看意思就是标准定义,定义有一些变量和宏。其中定义了NULL和offsetof()宏,NULL指向0或者是无效指针,offsetof获取一个元素在结构中的偏移量。下面看看具体的代码注释和笔记。

#ifndef _LINUX_STDDEF_H
#define _LINUX_STDDEF_H

#include <linux/compiler.h>

/*
 * #undef 预定义取消指令
 *
 * 如果NULL没有被预定义,则会忽略#undef指令
 * 一旦NULL被预定义了,则就会取消NULL的预定义
 */
#undef NULL
#if defined(__cplusplus)
#define NULL 0       //NULL被赋值为0
#else
#define NULL ((void *)0)   //NULL定义为无效的指针,将0强制转化为(void*)类型的指针
#endif

//如果offsetof被定义了,就会取消该定义
#undef offsetof
#ifdef __compiler_offsetof
#define offsetof(TYPE,MEMBER) __compiler_offsetof(TYPE,MEMBER)
#else
/*
 * 先指出目的:就是求出MEMBER在TYPE中的偏移量
 *
 * 原理:(TYPE *)0 将0强制转化成(TYPE*)类型的指针,记做TYPE *ptr = (TYPE *)0;
 *       ptr->MEMBER就是TYPE中的元素MEMBER,然后&(ptr->MEMBER),取得MEMBER的地址
 *       由于其基地址是0,最后在进行强制类型转化成int类型,就获取了MEMBER在TYPE中
 *       的偏移量了。
 */
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
#endif

#endif
时间: 2024-10-08 20:49:38

stddef.h头文件学习的相关文章

types.h头文件学习

types.h头文件纵观,就可以看出是对一些数据类型的重命名或者是定义,以及对DMA通用地址的定义以及其64为的特性.下面是types.h头文件的源代码,主要的学习内容都在注释当中. #ifndef _I386_TYPES_H #define _I386_TYPES_H #ifndef __ASSEMBLY__ /** * 纵观这个头文件,发现该头文件主要是用来给 * 定义类型以及给类型重新命名的 */ //将unsigned short 重命名为 umode_t typedef unsigne

jni.h头文件学习笔记

Now :2015年 6月 8日 星期一 22时17分05秒 CST Note: 这篇笔记是我半年前写的,当时因为某些原因经常需要写jni方面的代码,所以就深入学习了下jni方面的知识,现在再来看之前写的东西,一句话概括就是深度不够,废话太多.因为这是一个不全的笔记(还有一部分想写的内容未能写上),所以当初想分享给其他同事的也不好意思分享. #-------------Add Now-------------# jni是java native interface的简写,是java和c/c++通信

[转]C/C++关于string.h头文件和string类

学习C语言时,用字符串的函数例如stpcpy().strcat().strcmp()等,要包含头文件string.h 学习C++后,C++有字符串的标准类string,string类也有很多方法,用string类时要用到string.h头文件. 我现在看vc的书上也有CString类,这个要包含什么,怎么用? 我现在很迷惑,这两个 string.h有什么区别.是怎么回事 且看一: 这两个一个是标准C库的,定义了一些字符串的处理函数.一个是标准C++库的,定义了标准C++的std::string类

UNIX网络编程之旅-配置unp.h头文件环境

最近在学习Unix网络编程(UNP),书中steven在处理网络编程时只用了一个#include “unp.h”  相当有个性并且也很便捷 于是我把第三版的源代码编译实现了这个过程,算是一种个性化的开发环境的搭建吧,顺便把过程记录下来,以便自己以后查阅. 首先去网上找到源代码包unpv.13e.tar.gz 一找一大堆 解压缩到你的某个目录,unpv13e里面大致有这些目录 ├── aclocal.m4 ├── advio ├── bcast ├── config.guess ├── confi

CUDA gputimer.h头文件

#ifndef __GPU_TIMER_H__ #define __GPU_TIMER_H__ struct GpuTimer { cudaEvent_t start; cudaEvent_t stop; GpuTimer() { cudaEventCreate(&start); cudaEventCreate(&stop); } ~GpuTimer() { cudaEventDestroy(start); cudaEventDestroy(stop); } void Start() {

leetCode(55):Minimum Window Substring(limits.h头文件)

Given a string S and a string T, find the minimum window in S which will contain all the characters in T in complexity O(n). For example, S = "ADOBECODEBANC" T = "ABC" Minimum window is "BANC". Note: If there is no such windo

hpp头文件与h头文件的区别

hpp,其实质就是将.cpp的实现代码混入.h头文件当中,定义与实现都包含在同一文件,则该类的调用者只需要include该hpp文件即可,无需再将cpp加入到project中进行编译.而实现代码将直接编译到调用者的obj文件中,不再生成单独的obj,采用hpp将大幅度减少调用 project中的cpp文件数与编译次数,也不用再发布烦人的lib与dll,因此非常适合用来编写公用的开源库. hpp的优点不少,但是编写中有以下几点要注意: 1.是Header   Plus   Plus 的简写. 2.

.h头文件、 .lib库文件、 .dll动态链接库文件之间的关系(转)

h头文件作用:声明函数接口 dll动态链接库作用:含有函数的可执行代码 lib库有两种: (1)静态链接库(Static Libary,以下简称“静态库”) (2)动态连接库(DLL,以下简称“动态库”)的导入库(Import Libary,以下简称“导入库”) 两者的区别: 实质是不一样的东西. 静态库本身就包含了实际执行代码.符号表等等,而对于导入库而言,其实际的执行代码位于动态库中,导入库只包含了地址符号表等,确保程序找到对应函数的一些基本地址信息. 如:当我们在自己的程序中引用了一个h头

jni.h头文件详解(二)

一:struct JNINativeInterface_{} 结构体的作用:它有点像我们char字符驱动的 file_ops结构体,它定义各种函数对在(jni.h头文件详解一)中定义的各种数据的操作函数集体. 二:它包含那些针对Java中类和对象的相关操作呢如下图. 三:下面我们讲详细介绍14个部分方法的用法和解析 3.1.版本信息操作函数. 一.GetVersion jint (JNICALL *GetVersion)(JNIEnv *env) --模块信息:该模块主要针对的JNI接口的版本信