__attribute__
是 C 和 C++ 编译器提供的一种扩展机制,允许开发者给函数、变量或类型添加额外的信息或元数据,以影响编译器的行为。这种机制主要用于 GNU 编译器集合(GCC)以及基于 LLVM 的 Clang 编译器等工具中。下面是一些常见的 __attribute__
属性及其用途:
通用属性
-
visibility
- 用于控制函数或变量的链接可见性。
- 示例:
__attribute__((visibility("default")))
或__attribute__((visibility("hidden")))
-
nonnull
- 指定一个函数参数不应该为
NULL
。 - 示例:
void foo(const char * __attribute__((nonnull)) ptr);
- 指定一个函数参数不应该为
-
format
- 指定函数的某个参数遵循某种格式字符串。
- 示例:
int snprintf(char * __restrict s, size_t n, const char * __restrict format, ...) __attribute__((format(printf, 3, 4)));
-
nonnull
- 指定一个或多个参数必须是非空指针。
- 示例:
void example(const char *__restrict__ str) __attribute__((nonnull));
-
warn_unused_result
- 如果函数返回值未被使用,则发出警告。
- 示例:
int get_value() __attribute__((warn_unused_result));
-
pure
- 表明函数没有副作用,且结果仅依赖于其输入参数。
- 示例:
int square(int x) __attribute__((pure));
-
const
- 类似于
pure
,但表明函数还不会修改任何传入的指针参数所指向的数据。 - 示例:
int is_even(int x) __attribute__((const));
- 类似于
-
constructor/destructor
- 定义全局构造函数或析构函数,它们会在程序启动或结束时被自动调用。
- 示例:
void init() __attribute__((constructor));
-
noreturn
- 指示函数永远不会返回。
- 示例:
void exit(int status) __attribute__((noreturn));
-
aligned
- 设置变量或类型的对齐方式。
- 示例:
char buffer[1024] __attribute__((aligned(16)));
-
used
- 强制链接器保留某个符号,即使它看起来未被使用。
- 示例:
static int debug_flag __attribute__((used));
-
weak
- 创建一个弱符号,可以在其他地方被强定义覆盖。
- 示例:
int foo() __attribute__((weak));
其他属性
还有许多其他特定用途的属性,比如用于优化、调试辅助、内存模型控制等。这些属性的具体使用取决于编译器的支持情况。例如:
- nonnull
- nonnull (数组索引)
- sentinel
- always_inline
- malloc
- deprecated
- unused
- fallthrough
如何查找更多详细信息
如果你需要更详细的文档,可以参考 GCC 和 Clang 的官方文档。对于 GCC,你可以访问 GCC Attributes 页面获取更多信息。Clang 的文档同样提供了详细的描述,可以访问 Clang Attributes Reference 查看。
这些属性可以帮助你编写更安全、更高效的代码,同时也能更好地与编译器协作,利用编译器的优化特性。