GCC/G++编译器_attribute__

__attribute__ 是 C 和 C++ 编译器提供的一种扩展机制,允许开发者给函数、变量或类型添加额外的信息或元数据,以影响编译器的行为。这种机制主要用于 GNU 编译器集合(GCC)以及基于 LLVM 的 Clang 编译器等工具中。下面是一些常见的 __attribute__ 属性及其用途:

通用属性

  1. visibility

    • 用于控制函数或变量的链接可见性。
    • 示例:__attribute__((visibility("default")))__attribute__((visibility("hidden")))
  2. nonnull

    • 指定一个函数参数不应该为 NULL
    • 示例:void foo(const char * __attribute__((nonnull)) ptr);
  3. format

    • 指定函数的某个参数遵循某种格式字符串。
    • 示例:int snprintf(char * __restrict s, size_t n, const char * __restrict format, ...) __attribute__((format(printf, 3, 4)));
  4. nonnull

    • 指定一个或多个参数必须是非空指针。
    • 示例:void example(const char *__restrict__ str) __attribute__((nonnull));
  5. warn_unused_result

    • 如果函数返回值未被使用,则发出警告。
    • 示例:int get_value() __attribute__((warn_unused_result));
  6. pure

    • 表明函数没有副作用,且结果仅依赖于其输入参数。
    • 示例:int square(int x) __attribute__((pure));
  7. const

    • 类似于 pure,但表明函数还不会修改任何传入的指针参数所指向的数据。
    • 示例:int is_even(int x) __attribute__((const));
  8. constructor/destructor

    • 定义全局构造函数或析构函数,它们会在程序启动或结束时被自动调用。
    • 示例:void init() __attribute__((constructor));
  9. noreturn

    • 指示函数永远不会返回。
    • 示例:void exit(int status) __attribute__((noreturn));
  10. aligned

    • 设置变量或类型的对齐方式。
    • 示例:char buffer[1024] __attribute__((aligned(16)));
  11. used

    • 强制链接器保留某个符号,即使它看起来未被使用。
    • 示例:static int debug_flag __attribute__((used));
  12. weak

    • 创建一个弱符号,可以在其他地方被强定义覆盖。
    • 示例:int foo() __attribute__((weak));

其他属性

还有许多其他特定用途的属性,比如用于优化、调试辅助、内存模型控制等。这些属性的具体使用取决于编译器的支持情况。例如:

  • nonnull
  • nonnull (数组索引)
  • sentinel
  • always_inline
  • malloc
  • deprecated
  • unused
  • fallthrough

如何查找更多详细信息

如果你需要更详细的文档,可以参考 GCC 和 Clang 的官方文档。对于 GCC,你可以访问 GCC Attributes 页面获取更多信息。Clang 的文档同样提供了详细的描述,可以访问 Clang Attributes Reference 查看。

这些属性可以帮助你编写更安全、更高效的代码,同时也能更好地与编译器协作,利用编译器的优化特性。

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值