(void) (&_x == &_y) 作用

本文深入解析了一种在GCC中使用的特殊C宏定义技巧,通过typeof关键字动态确定变量类型,并巧妙利用编译警告避免类型错误,适用于类型比较和最大值计算。

#define max(x,y) ({ \
typeof(x) _x = (x);    \
typeof(y) _y = (y);    \
(void) (&_x == &_y);    \
_x > _y ? _x : _y; })


typeof(x)的意思是取x的类型,这不是标准C里的,gcc支持,vc不支持


(void) (&_x == &_y);这句话本身从执行程序来讲完全是一句废话,它的作用在于,本身我们无法做这样的操作typeof(_x)==typeof(_y),所以故意判断他们2个的地址指针是否相等,显然是不可能相等,但是如果_x和_y的类型不一样,其指针类型也会不一样,2个不一样的指针类型进行比较操作,会抛出一个编译警告。也就是说char *p; int *q; 然后p==q;,这个判断因为一个是char*一个是int*,会在编译时产生一个warning。巧妙就巧妙在这里。巧妙就巧妙在这里。通过void显式丢弃一个表达式的值,否则有些编译器会就此给出警告信息。

 

转自:https://blog.youkuaiyun.com/haozhao_blog/article/details/26284909

### C语言中的MIN宏定义及其组成部分 #### MIN宏的整体结构 `MIN` 宏是一种通用的最小值计算工具,在C语言中通常用于比较两个值并返回较小的那个。为了实现这一功能,同时兼顾类型安全性和代码可读性,许多实现会引入 `typeof` 关键字和 `(void)(&_x == &_y)` 这样的表达式来增强安全性。 以下是常见的 `MIN` 宏定义形式: ```c #define min(x, y) ({ \ typeof(x) _x = (x); \ typeof(y) _y = (y); \ (void) (&_x == &_y); \ _x < _y ? _x : _y; }) ``` --- #### `typeof` 关键字的作用 `typeof` 是一种扩展的关键字(并非标准C的一部分),主要用于获取某个表达式的类型,并将其作为新变量声明的基础。这使得我们可以动态地推导输入参数的类型,从而避免显式指定类型带来的麻烦[^3]。 具体来说: 1. 当 `x` 的类型为 `int` 时,`_x` 变量的数据类型也会被自动设置为 `int`。 2. 如果 `x` 是一个复杂的表达式(如 `3 - 4` 或其他运算结果),`_x` 的类型会被设定为该表达式的结果类型。 3. 对于函数调用的情况,例如 `function(int, int)`,`typeof(function(1, 2))` 将得到的是函数返回值的类型,而不是实际执行函数。 这种机制允许我们在不关心具体数据类型的情况下编写泛型代码,增强了代码的灵活性和重用性。 --- #### `(void)(&_x == &_y)` 的作用 `(void)(&_x == &_y)` 表达式的目的是进行严格的类型检查,防止潜在的误用或逻辑错误。其工作原理如下: 1. **地址取值操作**:`&_x` 和 `&_y` 分别表示 `_x` 和 `_y` 的内存地址。 2. **强制转换为空操作符**:虽然 `&_x == &_y` 实际上不会影响最终结果,但由于编译器会对未使用的表达式发出警告,因此通过 `(void)` 显式丢弃结果可以消除这些警告。 3. **类型一致性验证**:如果 `_x` 和 `_y` 类型不同,则它们的指针可能无法相等比较,此时编译器会产生错误提示,帮助开发者发现隐藏的问题[^5]。 这种方法不仅提高了代码的安全性,还减少了因隐式类型转换引发的风险。 --- #### 使用示例 以下是一个完整的例子,展示如何利用 `MIN` 宏完成数值比较任务: ```c #include <stdio.h> // MIN 宏定义 #define min(x, y) ({ \ typeof(x) _x = (x); \ typeof(y) _y = (y); \ (void) (&_x == &_y); \ _x < _y ? _x : _y; }) int main() { int a = 10; double b = 5.5; printf("Minimum value is %f\n", min(a, b)); // 输出 5.5 return 0; } ``` 在这个例子中,尽管 `a` 和 `b` 的类型不同,但 `typeof` 自动处理了类型匹配问题,而 `(void)(&_x == &_y)` 则确保两者能够兼容比较。 --- ### 总结 - `MIN` 宏的核心在于使用 `typeof` 动态推断输入参数的类型,提供了一种灵活且强大的方式来实现跨类型的最小值计算[^3]。 - `(void)(&_x == &_y)` 提供额外的保护层,检测潜在的类型冲突,提升代码健壮性[^5]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值