gpt4 book ai didi

c - Linux 内核中的类型检查宏是如何工作的?

转载 作者:IT王子 更新时间:2023-10-29 00:27:17 24 4
gpt4 key购买 nike

Linux 内核 4.16 的文件 include/linux/typecheck.h 包含这段代码。

#define typecheck(type,x) \
({ type __dummy; \
typeof(x) __dummy2; \
(void)(&__dummy == &__dummy2); \
1; \
}

检查 x 是否与参数 type 的类型相同。

但我无法理解这行:

 (void)(&__dummy == &__dummy2);

比较两个变量的首地址有什么帮助?

最佳答案

这使用了两个 GCC 扩展——表达式语句 ({ ... })typeof()

  1. 展开式的第一行声明了一个名为type 的变量。
  2. 扩展的第二行声明了一个与变量或表达式 x 相同类型的变量。
  3. 第三行比较两个指针,只有当两个虚拟变量的类型匹配时才会匹配,生成指针不匹配警告(如果使用 -Werror 编译则出错)。
  4. 最后一行(包含 1)是表达式的值——相当于 true。

因此,如果 x 的类型与命名类型不同,您会收到编译警告/错误。

示例代码:

#include <stdio.h>

#define typecheck(type,x) \
({ type __dummy; \
typeof(x) __dummy2; \
(void)(&__dummy == &__dummy2); \
1; \
})

int main(void)
{
int x;
if (typecheck(int, x))
printf("int x OK\n");
if (typecheck(double, x))
printf("double x OK\n");
return(0);
}

编译信息:

$ /usr/bin/gcc -O3 -g -std=gnu99 -Wall -Wextra xx.c -o xx  
xx.c: In function ‘main’:
xx.c:15: warning: comparison of distinct pointer types lacks a cast
$

请注意,因为我没有使用 -Werror,所以代码编译“OK”。输出是:

int x OK
double x OK

关于c - Linux 内核中的类型检查宏是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10393844/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com