有效使用IS_ERR()宏

时间:2014-04-15 05:20:21

标签: c linux macros compiler-construction linux-device-driver

我正在创建一个简单的驱动程序,并遇到了一个示例代码,它执行此操作

  if(IS_ERR(c = class_create(THIS_MODULE, "char")))
  {
   ...
  }

我试着知道IS_ERR()后面是什么,我看到了这一点 它定义为, ...

#define IS_ERR_VALUE(x) unlikely((x) >= (unsigned long)-MAX_ERRNO)
static inline long __must_check IS_ERR(const void *ptr)
{
      return IS_ERR_VALUE((unsigned long)ptr);
}

这是什么'不太可能'事?

2 个答案:

答案 0 :(得分:3)

参考:http://kernelnewbies.org/FAQ/LikelyUnlikely

possible()和impossible()是编译器指令,用于以最佳利用处理器管道的方式重新排列生成的条件分支代码。

if(可能(条件)):这个条件将是" true"在大多数情况下,编译器应该以这样的方式安排分支,即'然后'语句具有最少的跳转和管道刷新。

if(不太可能(条件)):这个条件将是" false"在大多数情况下,编译器应该以这样的方式安排分支,即“' else'语句具有最少的跳转和管道刷新。

答案 1 :(得分:0)

unlikely()的定义位于include/linux/compiler.h,其中之一是:

# ifndef likely
#  define likely(x) (__builtin_constant_p(x) ? !!(x) : __branch_check__(x, 1))
# endif
# ifndef unlikely
#  define unlikely(x)   (__builtin_constant_p(x) ? !!(x) : __branch_check__(x, 0))
# endif

这些宏是编译器的优化提示。