请不要质疑,从现在开始,尝试使用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语言的扩展属性。所以,你可以不明白它们的具体引用方式,但绝对不能不了解。今天我们一同简单了解,日后自有大用处!

微信公众号搜索“ 嵌入式系统开发者之家 ”

关注公众号 了解最新​​​​内容

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐