__builtin_expect() 原型是什么?

What is the __builtin_expect() prototype?

为了消除静态代码分析警告 (QA-C),我需要为 __builtin_expect() 提供函数原型。

我正在为 PowerPC 使用 WindRiver Diab 编译器。 在编译器手册中我找到了以下信息:

__builtin_expect(long exp, long c): ... exp is also the return value.

所以,我的原型如下:

long __builtin_expect(long exp, long c);

但是,它没有编译,我收到以下错误:

error (dcc:1701): invalid types on prototype to intrinsic __builtin_expect - when the intrinsic is enabled, optional user prototype must match

看来我的原型不正确。 __builtin_expect 的正确原型是什么?

错误消息指出用户原型是可选的。所以应该可以定义吧?

您应该仔细阅读 GCC 中 Other Builtins 的文档。

作为第一个近似值,您可以将 __builtin_expect 替换为(调用 _builtin_expect_replacement 的)下面的宏:

#define _builtin_expect_replacement(Exp,C) (Exp)

对于大多数静态分析器来说应该足够了

不要指望大多数 GCC 内置函数都可以定义为函数。

您需要以某种方式定义 __builtin_expect 以使您的静态分析器满意,因为它不知道该函数是什么。但是当您正常编译程序时,您需要使用 #ifdef 来禁用该定义,因为如果您尝试自己定义编译器内置函数,您的编译器将不喜欢它。内置函数随编译器一起提供,因此不应在您的程序中定义它们。

像这样的东西会起作用:

#ifdef _HEY_I_AM_RUNNING_STATIC_ANALYZER
#define __builtin_expect(e,c) (e)
#endif

我不知道你的静态分析器是如何工作的细节,所以我不知道 #ifdef 中要测试的正确宏是什么。您可以阅读静态分析器的文档,了解它是否默认定义了任何预处理器符号,或者您是否可以在 运行 时告诉它要定义的预处理器符号。