【C】__attribute__实现原理及应用
请不要质疑,从现在开始,尝试使用Linux为所有的ARM架构SOC开发、编译、调试代码有多英明神武!因为这是一套完整的、统一的,从低端到高端ARM SOC都支持的开发环境。GNU的开发工具,神级的存在!
本文主要讨论GCC(GNU Compiler Collection)中的__attribute__机制。同样适用于基于STM32的工程。
__attribute__是GCC提供的一种语法,用于向编译器提供更多的关于代码的元数据,从而让编译器进行更多的优化、更严格的检查或实现特定的功能。说点人话就是:它可以让我们更方便的管理编译链接方式,更方便的管理代码、数据的存储分布位置,更方便灵活的检查代码问题。
GCC提供了非常多的属性,我们现在只需要了解,日后用到的时候我们就有印象,不至于迷迷糊糊的一头雾水。以下是一些常见的属性及其含义:
__attribute__((packed)):用于结构体或联合体,告诉编译器取消结构体成员之间的内存对齐,按照实际占用的字节数进行排列。
__attribute__((aligned(n))):指定变量或结构体的对齐方式,n为对齐的字节数。
__attribute__((noreturn)):用于函数,表示该函数不会返回(例如,无限循环或终止程序)。
__attribute__((deprecated)):用于标记一个实体(如函数、变量、类型)已经过时,使用时会产生警告。
__attribute__((unused)):用于变量或函数,表示可能不会被使用,避免编译器产生未使用的警告。
__attribute__((weak)):用于声明一个弱符号,如果其他地方有强符号定义,则弱符号不会被使用。
__attribute__((section("name"))):将函数或变量放入指定的段(section)中。
__attribute__((noinline)):告诉编译器不要内联该函数。
__attribute__((always_inline)):告诉编译器总是内联该函数。
__attribute__((format(archetype, string-index, first-to-check))):用于函数,告诉编译器该函数使用类似printf/scanf的格式字符串,以便编译器检查格式字符串与参数的一致性。
__attribute__((const)):表示函数返回值仅依赖于参数,没有副作用,因此相同参数调用多次可以合并。
__attribute__((pure)):类似于const,但允许函数读取全局内存,不能修改。
__attribute__((constructor))和__attribute__((destructor)):用于函数,使函数在main函数之前(constructor)或之后(destructor)自动执行。
__attribute__((warning("message"))):当函数被调用时,编译器会发出警告,显示给定的消息。
__attribute__((error("message"))):当函数被调用时,编译器会报错,显示给定的消息。
// packed 属性
struct __attribute__((packed)) my_struct {
char a;
int b;
};
// deprecated 属性
void old_function() __attribute__((deprecated));
// noreturn 属性
void __attribute__((noreturn)) my_exit(int status);
// constructor 属性
void __attribute__((constructor)) my_init() {
// 在main之前执行
}
// format 属性
void my_log(const char *format, ...) __attribute__((format(printf, 1, 2)));
// section 属性
int __attribute__((section(".my_section"))) my_variable;
// aligned 属性
int __attribute__((aligned(16))) aligned_array[4];
数据结构定义的字节对齐、链接文件输出段与输入段的关联、内联函数限定、函数集合的实现、编译行为的限定等等,这些都离不开C语言的扩展属性。所以,你可以不明白它们的具体引用方式,但绝对不能不了解。今天我们一同简单了解,日后自有大用处!
微信公众号搜索“ 嵌入式系统开发者之家 ”

更多推荐




所有评论(0)