繁体   English   中英

基本C头文件语法

[英]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扩展,它允许您获取变量的类型(并在变量声明中使用它); 它存在,以便宏可以处理xy任何类型。
  • 第二个GCC扩展将({ ... })转换为一个表达式该表达式求值为其中最后一个语句的值 ; 这允许您在此块中声明变量,这是为了避免两次评估两个操作数xy xy的结果(可能类似于i++ ,你不想评估两次)存储在两个临时变量__x__y ,然后使用这两个临时变量而不是xy来避免双重评估。
  • __extension__是一个扩展,它会抑制您使用上述扩展名获得的警告。

是的, \\只是使宏的定义跨越多行( \\将行连接在一起,并且在编译过程中很早就完成了,甚至在查看宏和预处理器定义之前)。

这个严峻的要点是避免两次评估xy 如果你这样做了

bool g = isgreater(x++, y++);

你没有使用那个技巧,你会得到

bool g = !isunordered(x++, y++) && (x++ > y++);

这会导致xy每次增加两次,而不是像你想象的那样增加一次。 相反,通过这个技巧,你可以获得类似的东西(为临时变量使用更好的名称)

int tmpx = x++;
int tmpy = y++;
bool g = !isunordered(tmpx, tmpy) && (tmpx > tmpy);

(如果xy是整数)这是正确的并避免双增量。 这也适用于其他事情,例如函数调用:

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__yxy相同的类型。 然后继续检查这对值是否都是有序的isunordered是一个Math库函数), __x x大于__y

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM