gpt4 book ai didi

c - __attribute_warn_unused_result__ 与 __attribute__((warn_unused_result))

转载 作者:太空宇宙 更新时间:2023-11-04 01:46:21 26 4
gpt4 key购买 nike

在一些新项目中愉快地使用了 __attribute__((warn_unused_result)) 一段时间。我一直在使用 Vim 进行编码。

现在我有时在开发同一个项目时开始使用 KDevelop,并且有一个自动完成 __attribute_warn_unused_result__ (以及其他)以及我正在使用的 __attribute__ .

这两个 __attribute__((warn_unused_result))__attribute_warn_unused_result__ 是否相同?其中任何一个应该取代另一个吗?我意识到,在编辑标题 (*.h) 时,自动完成功能会建议两种选择,但在编辑源 (*.c) 时,该功能只会建议__attribute_warn_unused_result__

最佳答案

GCC 自 3.4 起支持此属性,因此 __attribute_warn_unused_result__ 定义为 __attribute__((warn_unused_result)) 或为空取决于 GCC 版本(参见 sys/cdefs.h )。

在您的编程系统中搜索 __attribute_warn_unused_result__ 定义。

更新:

属性 warn_unused_result 是编译器的一个特性。自 3.4 以来的任何 GCC 编译器都将识别并使用 __attribute__((warn_unused_result))。但是其他编译器可能不支持此功能,或者可能以其他方式指定。

另一方面,库头文件中定义的__attribute_warn_unused_result__宏。目的——为不受支持的编译器删除属性的能力;隐藏实现细节并以另一种方式指定此属性。

但是这个宏依赖于库的实现。例如,宏在 arm-none-eabi-gcc 4.9.3 和 avr-gcc 4.9.2 包中根本不存在,就像我仍然在一个“古老”项目中使用的 mingw32-gcc 3.4.2 一样。

对于 gcc-linaro-7.2.1-2017.11-x86_64_arm-eabi 类似用途的宏定义为

#define __result_use_check  __attribute__((__warn_unused_result__))

但在 gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabihf 包中,定义(整个 sys/cdefs.h 文件)与 Ubuntu 16.04 中的“原生”gcc 相同。

#define __attribute_warn_unused_result__ \
__attribute__ ((__warn_unused_result__))

因此,哪种方法取代另一种方法取决于目标。在我看来:

  • 对于应该在多个平台上与 GCC (>= 3.4) 一起使用的代码,最好使用显式 __attribute__((__warn_unused_result__))

  • 对于应该由多个可能不支持此功能或可能以不同方式支持此功能的编译器编译的代码,最好使用一些宏(甚至可以是自定义的)。

  • 对于已经存在的项目,最好使用当前代码中最常用的方法:-)

关于头文件和源文件的不同行为的自动完成。我不知道。可能只是特定 IDE 的独创性(自动完成)。

关于c - __attribute_warn_unused_result__ 与 __attribute__((warn_unused_result)),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53169938/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com