首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >__builtin_expect()原型是什么?

__builtin_expect()原型是什么?
EN

Stack Overflow用户
提问于 2017-02-16 18:13:14
回答 2查看 971关注 0票数 2

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

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

__builtin_expect(long exp, long c):. exp也是返回值。

所以,我的原型如下:

代码语言:javascript
复制
long __builtin_expect(long exp, long c);

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

错误(dcc:1701):原型上的无效类型到内部__builtin_expect -当启用内禀时,可选的用户原型必须匹配

我的原型似乎不正确。__builtin_expect的正确原型是什么?

错误消息声明用户原型是可选的。所以应该可以给它下定义,对吧?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-02-16 18:35:50

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

像这样的东西会有用的:

代码语言:javascript
复制
#ifdef _HEY_I_AM_RUNNING_STATIC_ANALYZER
#define __builtin_expect(e,c) (e)
#endif

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

票数 5
EN

Stack Overflow用户

发布于 2017-02-16 18:17:46

你应该仔细阅读GCC的其他建筑文档。

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

代码语言:javascript
复制
#define _builtin_expect_replacement(Exp,C) (Exp)

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

不要指望大多数GCC建筑都可以定义为功能。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42281658

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档