Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
GCC匿名函数变量值比较的预期效果';地址_C - Fatal编程技术网

GCC匿名函数变量值比较的预期效果';地址

GCC匿名函数变量值比较的预期效果';地址,c,C,Linux内核为非特定类型的数值操作定义了许多辅助宏。即宏min和max定义为(in) 比较在匿名函数范围内定义的临时变量的地址,然后丢弃结果;(无效)强制转换以防止出现任何警告 我想知道这有什么副作用?天真地说,我希望这会得到优化,因为它没有副作用(至少我知道没有副作用)。如果两个变量的类型不同,编译器会抱怨=。所以我怀疑这是为了确保这些值真的可以比较 尝试: 是的,除了使用-O0获取地址通常会强制将值转储到内存之外,还将使用任何优化级别对操作进行优化。您不能获取寄存器变量的地址哦!当然可以奥

Linux内核为非特定类型的数值操作定义了许多辅助宏。即宏
min
max
定义为(in)

比较在匿名函数范围内定义的临时变量的地址,然后丢弃结果;
(无效)
强制转换以防止出现任何警告


我想知道这有什么副作用?天真地说,我希望这会得到优化,因为它没有副作用(至少我知道没有副作用)。

如果两个变量的类型不同,编译器会抱怨
=
。所以我怀疑这是为了确保这些值真的可以比较

尝试:


是的,除了使用
-O0

获取地址通常会强制将值转储到内存之外,还将使用任何优化级别对操作进行优化。您不能获取寄存器变量的地址哦!当然可以奥托:我想知道这有多大意义?例如,我认为比较一个,比如说,
signed long
和一个
signed char
没有问题,根据整数提升规则,操作将
signed char
提升为
signed long
。我可以想到很多情况下,人们可能希望进行这样的比较。@DatenWalf:问题是,这里要么全有,要么一无所有。如果没有这一点,您还可以根据转换规则比较例如
int
和指针。也许这对于较旧的编译器(C99之前)更为必要,因为它们不太喜欢触发(并且请求警告的选项也少得多)。如果要比较兼容的类型,即使使用
typeof()
@machine\u 1,也可以强制转换参数:不要更改正确的语法。
#ifndef max
#define max(x, y) ({ \
        typeof(x) _max1 = (x); \
        typeof(y) _max2 = (y); \
        (void) (&_max1 == &_max2); \
        _max1 > _max2 ? _max1 : _max2; })
#endif
#ifndef min
#define min(x, y) ({ \
        typeof(x) _min1 = (x); \
        typeof(y) _min2 = (y); \
        (void) (&_min1 == &_min2); \
        _min1 < _min2 ? _min1 : _min2; })
#endif
   (void) (&_min1 == &_min2);
int i;
char *p;
(void)min(i, p);