__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 查看。
这些属性可以帮助你编写更安全、更高效的代码,同时也能更好地与编译器协作,利用编译器的优化特性。
