(e)为0,sizeof(struct { int:0; })为0,编译通过且不影响最终值。 当a为指针时,__same_type((a), &(a)[0]),两者类型相同,返回1,即e为1,-!!(e)为-1,无法编译。 3.求两个数中最大值的宏MAX 思考这个问题,你会怎么写 3.1一般的同学: #define MAX(a,b) a > b ? a : b 存在问题,例...
sizeof(int) == sizeof(*((int *) (NULL))) // if `x` was an integer constant expression sizeof(int) == sizeof(*((void *)(...))) // otherwise 因为sizeof(void) = 1,所以如果x是整数常量表达式,则宏的结果为1,否则为0。 https://stackoverflow.com/questions/49481217/linux-kernels-i...
对于32位系统而言,size_t是unsigned int类型;对于64位系统而言,size_t是unsigned long类型。 1.2 offsetof示例 代码(offset_test.c) #include <stdio.h> // 获得结构体(TYPE)的变量成员(MEMBER)在此结构体中的偏移量。 #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) struct student ...
#defineBUILD_BUG_ON_ZERO(e) (sizeof(struct {int:-!!(e); })) 上来就是个小技巧:!!(e)是将e转换为0或1,加个-号即将e转换为0或-1。 再用到了位域: 有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1 两种状态,用一位二进位即...
unsigned long size = (NR_CPUS+31)/32; typedef struct{unsigned long bits[size];} cpumask_t; 这里BITS_PER_LONG取32,(NR_CPUS+31)/32就是对(NR_CPUS/32)上取整。 问题是,下面这个宏在下就看不懂了 #define CPU_MASK_NONE \ (cpumask_t) { { \ [0 ... BITS_TO_LONGS(NR_CPUS)-1] =...
C语言宏定义,Linux中的一些宏定义 下面列举了一些常见的宏写法: #include <stdio.h>#include<stdlib.h>#definebyte char#defineword short//得到指定地址上的一个字节或字#defineMEM_B( x ) ( *( (byte *) (x) ) )#defineMEM_WORD( x ) ( *( (int *) (x) ))//得到一个field在结构体(struct...
BUILD_BUG_ON_ZERO(e) 宏 1. #define BUILD_BUG_ON_ZERO(e) (sizeof(struct { int:-!!(e); })) 检查表达式e是否为0,为0编译通过且返回0;如果不为0,则编译不通过。 1. struct { int : –!!(0); } -=> struct { int : 0; } ...
每一级有以下三个关键描述宏: • SHIFT • SIZE • MASK 如页的对应描述为: 数据结构定义如下: 2.1 Page Directory (PGD and PMD) 每个进程有它自己的PGD( Page Global Directory),它是一个物理页,并包含一个pgd_t数组。其定义见<asm/page.h>。 进程的pgd_t数据见 task_struct -> mm_struct ->...
分析: ((size_t) &((TYPE *)0)->MEMBER),假设TYPE 数据类型如下: typedef struct student { char name[32]; int age; }; 1. 2. 3. 4. 第一步:我们先看最里层((TYPE*)0)。实际上是将0地址强转为TYPE结构的指针。指向一个TYPE类型的结构体变量,这里就是 student 类型。