kernel.h中min宏中"(void)(&_min1 ==&_min2)"的功能是什么?

Rob*_*nes 60 c linux-kernel

kernel.h中, min定义为:

#define min(x, y) ({                \
    typeof(x) _min1 = (x);          \
    typeof(y) _min2 = (y);          \
    (void) (&_min1 == &_min2);      \
    _min1 < _min2 ? _min1 : _min2; })
Run Code Online (Sandbox Code Playgroud)

我不明白这行(void) (&_min1 == &_min2);是做什么的.是某种类型检查还是什么?

pmg*_*pmg 59

该声明

(void) (&_min1 == &_min2);
Run Code Online (Sandbox Code Playgroud)

是一个保证"无操作".所以唯一的原因是它的副作用.

但声明没有副作用!

但是:它强制编译器在类型xy不兼容时发出诊断.
请注意,测试_min1 == _min2将隐式地将其中一个值转换为另一个类型.

所以,我猜,这就是它的作用.它在编译时验证类型xy兼容性.

  • 也许最好说它没有_runtime_副作用,而是_compilation_副作用。 (2认同)
  • @Robert:尝试,例如,`m = min(42,43.0);`.有和没有相关的声明. (2认同)
  • `int`和`volatile const int`是不同但兼容的类型! (2认同)

Has*_*kun 18

include/linux/kernel.h中的代码将此称为"不必要的"指针比较.这实际上是一种严格的类型检查,确保其类型xy相同.

此处类型不匹配将导致编译错误或警告.

  • 不,这是一个小鸟.它在void上下文中调用,因此结果无关紧要,优化器会完全消除它. (2认同)

Sha*_*our 11

这提供了类型检查,指针之间的相等应该在兼容类型之间,并且gcc对于不是这样的情况将提供警告.

我们可以看到指针之间的相等性要求指针与草案C99标准部分Equality运算符中兼容类型相同:6.5.9

以下其中一项应持有:

包括:

两个操作数都是指向兼容类型的限定或非限定版本的指针;

我们可以从兼容类型和复合类型中找到兼容类型的内容,其中说:6.2.7

如果类型相同,则两种类型具有兼容类型

关于osnews的讨论也涵盖了这一点,它的灵感来自Linux内核文章中具有相同代码示例的GCC hacks.答案是:

与类型检查有关.

制作一个简单的程序:

int x = 10; 
long y = 20;
long r = min(x, y);
Run Code Online (Sandbox Code Playgroud)

给出以下警告:警告:不同指针类型的比较缺少强制转换


Emi*_*Sit 6

请参阅http://www.osnews.com/comments/20566,其解释如下:

它与类型检查有关.

制作一个简单的程序:

int x = 10; 
long y = 20; 
long r = min(x, y); 
Run Code Online (Sandbox Code Playgroud)

给出以下警告:警告:不同指针类型的比较缺少强制转换