[英]Basic C header file syntax
我正在查看IDE中包含的math.h标头。 我看到以下代码是我不理解的语法。 这是基本的东西,但有人可以向我解释这是如何工作的吗?
#define isgreater(x,y) \
(__extension__ ({__typeof__(x) __x = (x); __typeof__(y) __y = (y); \
!isunordered(__x,__y) && (__x > __y);}))
那么例如当你用双下划线开始时它会做什么,例如: __typeof
是否允许未定义的大小? 所以这个宏可以采用不同大小的值?
斜线只是跨越源中的换行符吗?
__extension__
做什么?
谢谢
您正在使用一些编译器扩展:
__typeof__
是一个GCC扩展,它允许您获取变量的类型(并在变量声明中使用它); 它存在,以便宏可以处理x
和y
任何类型。 ({ ... })
转换为一个表达式,该表达式求值为其中最后一个语句的值 ; 这允许您在此块中声明变量,这是为了避免两次评估两个操作数x
和y
。 x
和y
的结果(可能类似于i++
,你不想评估两次)存储在两个临时变量__x
和__y
,然后使用这两个临时变量而不是x
和y
来避免双重评估。 __extension__
是一个扩展,它会抑制您使用上述扩展名获得的警告。 是的, \\
只是使宏的定义跨越多行( \\
将行连接在一起,并且在编译过程中很早就完成了,甚至在查看宏和预处理器定义之前)。
这个严峻的要点是避免两次评估x
和y
。 如果你这样做了
bool g = isgreater(x++, y++);
你没有使用那个技巧,你会得到
bool g = !isunordered(x++, y++) && (x++ > y++);
这会导致x
和y
每次增加两次,而不是像你想象的那样增加一次。 相反,通过这个技巧,你可以获得类似的东西(为临时变量使用更好的名称)
int tmpx = x++;
int tmpy = y++;
bool g = !isunordered(tmpx, tmpy) && (tmpx > tmpy);
(如果x
和y
是整数)这是正确的并避免双增量。 这也适用于其他事情,例如函数调用:
isgreater(launch_missiles(3), launch_missiles(4));
没有技巧,你最终会发射14枚导弹而不是7枚,这将是灾难性的。
重新格式化定义可能对您有所帮助
#define isgreater(x,y) \
( \
__extension__ ( \
{ \
__typeof__(x) __x = (x); \
__typeof__(y) __y = (y); \
!isunordered(__x,__y) && (__x > __y); \
} \
) \
)
__extension__
标记使用gcc扩展到标准ANSI C的代码。在这种情况下的扩展是__typeof__
运算符,它在编译时提供变量的类型,并且它用于声明__x
和__y
与x
和y
相同的类型。 然后继续检查这对值是否都是有序的 ( isunordered
是一个Math库函数), __x
x大于__y
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.