【ARM 嵌入式 编译系列 3.1 -- GCC __attribute__((used)) 使用】

文章目录

    • `__attribute__((used))` 属性介绍
      • 代码演示
      • 编译与输出
      • GCC 编译选项

上篇文章:ARM 嵌入式 编译系列 3 – GCC attribute((weak)) 弱符号使用
下篇文章:ARM 嵌入式 编译系列 3.2 – glibc 学习

__attribute__((used)) 属性介绍

在普通的 C/C++ 程序中,有的时候为了调试,我们会特别地注释掉某个函数的调用。然而在编译时,编译器会发现,代码中实现了一个函数,但是最终却没有调用它,那么为什么还要写这个函数呢?于是会警告。

__attribute__((used)),表示对于这个函数可能不会调用它、可能用不到它,编译器不用进行 warning 提示。
而在嵌入式中 中断函数都是由内部的中断处理机制通过中断向量做跳转调用的,不是开发人员 “显式” 去调用的,因此在一些规则检查比较严格的编译器上编译时,就会出现类似于上面的警告,为了视野干净我们就添加这个属性。

向编译器说明这段代码有用,即使在没有用到的情况下编译器也不会警告!告诉编译器避免被链接器因为未用过而被优化掉。

代码演示

#include "stdio.h"static void unused_fun(void)
{printf("this fun is not used\n");
}int main(void)
{printf("hello world!\n");return 0;
}

编译与输出

gcc -Wall -Werror -Wunused-function test.c -o test

错误log:
test.c:3:13: error: ‘unused_fun’ defined but not used [-Werror=unused-function]
3 | static void unused_fun(void)
| ^~~~~~~~~~
cc1: all warnings being treated as errors


增加 __attribute__((unused))__ 即可编译通过

#include "stdio.h"static __attribute__((unused))__ void unused_fun(void)
{printf("this fun is not used\n");
}int main(void)
{printf("hello world!\n");return 0;
}

GCC 编译选项

在GCC中,如果你想要检查程序中未使用的变量,函数或标签,可以使用以下编译参数:

-Wunused-variable:此选项会让GCC发出警告,如果你的代码中定义了一个变量,但从未使用过它。

-Wunused-function:此选项会让GCC发出警告,如果你的代码中定义了一个静态函数,但从未使用过它。

-Wunused-label:此选项会让GCC发出警告,如果你的代码中定义了一个标签,但从未使用过它。

你也可以使用-Wunused参数来启用所有未使用相关的警告,这相当于 -Wunused-variable -Wunused-function -Wunused-label

例如,下面的命令将会在编译时检查未使用的变量、函数和标签,并将所有警告视为错误:

gcc -Wunused -Werror -o output source.c

在这个命令中,-Werror参数将会把所有的警告转换成错误,如果你的代码中有任何未使用的变量、函数或标签,这个命令将会失败,并输出相应的错误信息。

上篇文章:ARM 嵌入式 编译系列 3 – GCC attribute((weak)) 弱符号使用
下篇文章:ARM 嵌入式 编译系列 3.2 – glibc 学习

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/32232.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

20.4 HTML 表单

1. form表单 <form>标签: 用于创建一个表单, 通过表单, 用户可以向网站提交数据. 表单可以包含文本输入字段, 复选框, 单选按钮, 下拉列表, 提交按钮等等. 当用户提交表单时, 表单数据会发送到服务器进行处理.action属性: 应指向一个能够处理表单数据的服务器端脚本或UR…

在SpringBoot项目中使用线程池创建一个线程案例

目录 1. 首先,在你的Spring Boot项目的配置类中,创建一个`ThreadPoolTaskExecutor`的Bean:2. 在你的Service类中,创建一个异步方法,并使用`@Async`注解将其标记为异步方法,该方法将在线程池中执行:3. 在Controller中调用异步方法:在Spring Boot项目中使用线程池可以通过…

React入门学习笔记3

事件处理 通过onXxx属性指定事件处理函数(注意大小写) React使用的是自定义(合成)事件, 而不是使用的原生DOM事件——为了更好的兼容性 eg&#xff1a;οnclick》onClickReact中的事件是通过事件委托方式处理的(委托给组件最外层的元素)——为了更高效通过event.target得到发生…

【Express.js】软件测试

软件测试 本节介绍如何在 express.js 使用 Jest 进行单元测试 准备工作 准备一个基础的 express 项目&#xff0c;本文基于 evp-express-cli安装 Jest npm install jest --save-dev生成 Jest 配置 npx jest --init编写测试 创建测试文件&#xff0c;以 .test.js 后缀命名…

AlmaLinux 9 安装 Go 1.20

AlmaLinux 9 安装 Golang 1.20 1. 下载 go 安装包2. 安装 go3. 配置环境变量4. 确认 go 版本 1. 下载 go 安装包 访问 https://go.dev/dl/&#xff0c;下载你想安装的版本&#xff0c;比如 go1.20.7.linux-amd64.tar.gz&#xff0c; 2. 安装 go (可选)删除旧版本&#xff0c;…

CLIP论文精度

CLIP论文精度 Zero-shot CLIP多模态模型 Image Endecoder是一个图片编码器&#xff0c;既可以是ResNet,也可以是Vision Transformer. Text Encoder和Image Encoder产生的两组特征进行对比学习&#xff08;无监督训练&#xff09; 分类头&#xff1f;“分类头” 是指网络结…

matlab使用教程(13)—稀疏矩阵创建和使用

使用稀疏矩阵存储包含众多零值元素的数据&#xff0c;可以节省大量内存并加快该数据的处理速度。sparse 是一种属性&#xff0c;可以将该属性分配给由 double 或 logical 元素组成的任何二维 MATLAB 矩阵。通过 sparse 属性&#xff0c;MATLAB 可以&#xff1a; • 仅存储矩…

openGauss学习笔记-37 openGauss 高级数据管理-事务

文章目录 openGauss学习笔记-37 openGauss 高级数据管理-事务37.1 语法格式37.2 参数说明37.3 示例 openGauss学习笔记-37 openGauss 高级数据管理-事务 事务是用户定义的一个数据库操作序列&#xff0c;这些操作要么全做要么全不做&#xff0c;是一个不可分割的工作单位。ope…

SpringBoot案例-部门管理-删除

目录 查看页面原型&#xff0c;明确需求 页面原型 需求 阅读接口文档 思路分析 功能接口开发 控制层&#xff08;Controllre类&#xff09; 业务层&#xff08;Service类&#xff09; 持久层&#xff08;Mapper类&#xff09; 接口测试 前后端联调 查看页面原型&a…

全面讲解|DCMM数据管理能力成熟度及各地政策汇总

信息技术与经济社会的交汇融合引发了数据爆发式增长。数据蕴含着重要的价值&#xff0c;已成为国家基础性战略资源&#xff0c;正日益对全球生产、流通、分配、消费活动以及经济运行机制、社会生活方式和国家治理能力产生重要影响。数据价值发挥的前提是管理好数据&#xff0c;…

docker 学习笔记 (持续更新)

一些基础概念 Docker 入门教程 - 阮一峰的网络日志 什么是image文件&#xff1f; Docker 把应用程序及其依赖&#xff0c;打包在 image 文件里面。只有通过这个文件&#xff0c;才能生成 Docker 容器。image 文件可以看作是容器的模板。Docker 根据 image 文件生成容器的实例。…

13_Ansible role、创建目录结构、Roles依赖关系;Playbook参考资料:facts、with_item、jinja模板、role角色

16.Ansible role 16.1.Ansible Roles介绍 16.2.创建目录结构 16.3.Ansible Roles依赖关系 17.其它参考资料 17.1.Playbook参考资料 17.2.Ansible facts 17.3.判断语句 when 17.4.with_items 17.5.ansible jinja模板 17.6.ansible role角色 17.7.变量其它参考文档 16.Ansible r…

【Codeforces】 CF1734E Rectangular Congruence

题目链接 CF方向 Luogu方向 题目解法 暂时不考虑 b i b_i bi​ 的限制 考虑构造 a i , j i j a_{i,j}ij ai,j​ij&#xff0c; 那么 a r 1 , c 1 a r 2 , c 2 r 1 c 1 r 2 c 2 , a r 1 , c 2 a r 1 , c 2 r 1 c 2 r 2 c 1 a_{r1,c1}a_{r2,c2}r1c1r2c2,\;a_{r1,c2}…

设计模式(5)代理模式

一、介绍&#xff1a; 【Subject/抽象角色】定义了RealSubject和Proxy的共用接口&#xff0c;这样就可以在任何使用RealSubject的地方都可以使用Proxy 【RealSubject/真实角色】定义Proxy所代表的真实实体 【Proxy/代理角色】保存一个引用使得代理可以访问实体&#xff0c;并…

题目:2319.判断矩阵是否是 X 矩阵

​​题目来源&#xff1a; leetcode题目&#xff0c;网址&#xff1a;2319. 判断矩阵是否是一个 X 矩阵 - 力扣&#xff08;LeetCode&#xff09; 解题思路&#xff1a; 遍历矩阵&#xff0c;对于每一个节点&#xff0c;先判断是否处于主对角线或副对角线上&#xff0c;然后判…

LVGL学习笔记 28 - 键盘keyboard

目录 1. 设置关联文本框 2. 设置模式 2.1 LV_KEYBOARD_MODE_TEXT_LOWER 2.2 LV_KEYBOARD_MODE_TEXT_UPPER 2.3 LV_KEYBOARD_MODE_SPECIAL 2.4 LV_KEYBOARD_MODE_NUMBER 2.5 LV_KEYBOARD_MODE_USER_1 ~ LV_KEYBOARD_MODE_USER_4 3. 使能弹窗模式 4. 更改按键布局 5. 事…

后台管理系统

1.1 项目概述 简易后台管理系统是一个基于Vue3ElemrntPlus的后台管理系统&#xff0c;提供了用户登录、记住密码、数据的增删改查、分页、错误信息提示等功能&#xff0c;旨在协助管理员对特定数据进行管理和操作。 没有后台对接&#xff0c;数据源为假数据。 全部代码已上传G…

2023年的C++基础笔记

C 基本语法 对象 - 对象具有状态和行为。例如&#xff1a;一只狗的状态 - 颜色、名称、品种&#xff0c;行为 - 摇动、叫唤、吃。对象是类的实例。 类 - 类可以定义为描述对象行为/状态的模板/蓝图。 方法 - 从基本上说&#xff0c;一个方法表示一种行为。一个类可以包含多个…

elementui动态表单实现计算属性携带参数,并将计算出的值四舍五入保留两位小数

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言方法1方法2结论 前言 写项目的时候&#xff0c;遇到需要在动态表单中&#xff0c;将同一级输入框输入的内容计算出来&#xff0c;并动态显示&#xff0c;发现c…