为什么builtin_expect采用long而不是bool?

时间:2013-11-18 10:13:33

标签: c gcc linux-kernel llvm-gcc

我正在阅读GCC手册 http://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html

我有关于builtin_expect

的以下问题
  

long __builtin_expect(long exp,long c)

当类型应该是bool时,为什么是long类型的exp?

例如:内核定义了一个宏,用于将表达式转换为bool

  

定义可能的(x)__builtin_expect(!!(x),1)

那为什么不定义一个exp为bool而不是long的接口?

1 个答案:

答案 0 :(得分:0)

__builtin_expect会返回exp的值,因此为了保持一致,它应该将其返回为与exp相同的类型。

long的选择(如果确实如此,并且文档不仅仅缺乏落后者)可能是历史性的。我对这种功能的期望是让表达式exp在类型和值上完全不变。此功能只应通过提示编译器“注释”代码,而不是更改语义,例如exp的类型为unsigned long

顺便说一下,内核宏中的表达式!!(x)没有类型_Bool,而是int,这个例子只是exp的特定用例只有两个结果。该功能本身比这更通用。