__attribute__机制

news2024/11/16 19:57:26

__attribute__((constructor))和 __attribute__((destructor))

__attribute__((constructor)):放在main函数之前执行的函数的前面。

 __attribute__((destructor)):放在main函数之后执行的函数的前面。

测试代码

#include <stdio.h>
#include <stdlib.h>

#define _DEBUG_INFO
#ifdef _DEBUG_INFO
#define DEBUG_INFO(format, ...) printf("%s:%d $$ " format "\n" \
,__func__,__LINE__ \
, ##__VA_ARGS__)
#else
#define DEBUG_INFO(format, ...)
#endif

__attribute__((constructor))
void before_main(void){
    DEBUG_INFO("before_main");
}

__attribute__((destructor))
void after_main(void){
    DEBUG_INFO("after_main");
}

int main(int argc, char **argv){
    DEBUG_INFO("main");
    return 0;
}

执行结果:

 __attribute__((noreturn))

不返回,不是返回void,也就是说被它修饰的函数,最后会exit(0)程序。

#include <stdio.h>
#include <stdlib.h>

#define _DEBUG_INFO
#ifdef _DEBUG_INFO
#define DEBUG_INFO(format, ...) printf("%s:%d $$ " format "\n" \
,__func__,__LINE__ \
, ##__VA_ARGS__)
#else
#define DEBUG_INFO(format, ...)
#endif

__attribute__((noreturn))
void test()
{
    exit(0);
}

int main(int argc, char **argv){
    DEBUG_INFO("main");
    test();
    return 0;
}

执行结果:

__attribute__((mode(HI)))和__attribute__((mode(QI)))

#include <stdio.h>
#include <stdlib.h>

#define _DEBUG_INFO
#ifdef _DEBUG_INFO
#define DEBUG_INFO(format, ...) printf("%s:%d $$ " format "\n" \
,__func__,__LINE__ \
, ##__VA_ARGS__)
#else
#define DEBUG_INFO(format, ...)
#endif

typedef unsigned int myint_hi __attribute__((mode(HI)));
typedef unsigned int myint_qi __attribute__((mode(QI)));

int main(int argc, char **argv){
    DEBUG_INFO("mode(HI):sizeof(myint_hi) = %d\n",sizeof(myint_hi));
    DEBUG_INFO("mode(QI):sizeof(myint_qi) = %d\n",sizeof(myint_qi));

    return 0;
}

 执行结果:

__attribute__((packed))

#include <stdio.h>
#include <stdlib.h>

#define _DEBUG_INFO
#ifdef _DEBUG_INFO
#define DEBUG_INFO(format, ...) printf("%s:%d $$ " format "\n" \
,__func__,__LINE__ \
, ##__VA_ARGS__)
#else
#define DEBUG_INFO(format, ...)
#endif

struct private_data_1{int a;char b;float c} __attribute__((packed));
struct private_data_2{int a;char b;float c};


int main(int argc, char **argv){
    DEBUG_INFO("sizeof(struct private_data_1) = %d\n",sizeof(struct private_data_1));
    DEBUG_INFO("sizeof(struct private_data_2) = %d\n",sizeof(struct private_data_2));
    return 0;
}

 执行结果:

 实验解析:

两个相同的结构体,正常情况下会4字节内存对齐,大小12个字节

__attribute__((aligned(1))) 

#include <stdio.h>
#include <stdlib.h>

#define _DEBUG_INFO
#ifdef _DEBUG_INFO
#define DEBUG_INFO(format, ...) printf("%s:%d $$ " format "\n" \
,__func__,__LINE__ \
, ##__VA_ARGS__)
#else
#define DEBUG_INFO(format, ...)
#endif

struct private_data_1{int a;long long d;char b;float c;} __attribute__((packed));
struct private_data_2{int a;long long d;char b;float c;};
struct private_data_3{int a;long long d;char b;float c;} __attribute__((aligned(1)));
struct private_data_4{int a;long long d;char b;float c;} __attribute__((aligned(2)));
struct private_data_5{int a;long long d;char b;float c;} __attribute__((aligned(4)));
struct private_data_6{int a;long long d;char b;float c;} __attribute__((aligned(8)));

int main(int argc, char **argv){
    DEBUG_INFO("sizeof(struct private_data_1) = %ld\n",sizeof(struct private_data_1));
    DEBUG_INFO("sizeof(struct private_data_2) = %ld\n",sizeof(struct private_data_2));
    DEBUG_INFO("sizeof(struct private_data_3) = %ld\n",sizeof(struct private_data_3));
    DEBUG_INFO("sizeof(struct private_data_4) = %ld\n",sizeof(struct private_data_4));
    DEBUG_INFO("sizeof(struct private_data_5) = %ld\n",sizeof(struct private_data_5));
    DEBUG_INFO("sizeof(struct private_data_6) = %ld\n",sizeof(struct private_data_6));
    return 0;
}

 执行结果:

晕,该不会写错了吧。

 

消除未使用的变量的警告

int main(){
    int i = 0;
    return 0;
}

这段代码会报警 

warning: unused variable ‘i’ [-Wunused-variable]    
     int i  = 0;

 消除报警的写法

 int i __attribute__((unused)) = 0;

 或者

__attribute__((unused))
    int i  = 0;

小结

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

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

相关文章

RocketMQ 详解

&#x1f3c6;今日学习目标&#xff1a; &#x1f340;RocketMQ 详解 ✅创作者&#xff1a;林在闪闪发光 ⏰预计时间&#xff1a;30分钟 &#x1f389;个人主页&#xff1a;林在闪闪发光的个人主页 &#x1f341;林在闪闪发光的个人社区&#xff0c;欢迎你的加入: 林在闪闪发光…

【Shell】复制用户传参的文件夹

授权 cd /Users/lion/Downloads/shell-test-demos chmod ux *.sh#!/bin/bashprintHelp() {echo "-p pic (required) path for pic"exit 1 }while getopts p:h OPT; docase $OPT inp) path"$OPTARG" ;;esac done# check api_key exists if [ -z "$pat…

IDEA字体配置

IDEA默认字体&#xff1a;JetBrains Mono 1、下载Monaco字体&#xff08;windows版&#xff09;&#xff1a;下载地址&#x1f448; 2、双击安装 3、在IDEA中切换Monaco字体

帆软Json数据集插件,数据查询及参数控件传参

先看Demo 文本查询&#xff0c;下拉复选框查询&#xff0c;无参数时查全部 有参数传参时 1.定义数据连接 测试地址&#xff1a; http://fine-doc.oss-cn-shanghai.aliyuncs.com/book.json 2.新建json数据集&#xff0c;查询全表 2.1.查询全表 2.2.查询单个字段 3. 上述是简单…

CLion开发STM32

CLion开发STM32 opencd https://gnutoolchains.com/arm-eabi/openocd/ gcc-arm-none-eabi https://launchpad.net/gcc-arm-embedded/download arm-none-eabi-gcc -v“gcc-arm-none-eabi是GNU项目下的软件,是一个面向裸机arm的编译器。 mingw 需要把opencd和的工具链添加…

移远通信全新3GPP NTN R17模组正式上线,助力实现空天地海网络全覆盖

6月29日&#xff0c;在2023上海世界移动通信大会期间&#xff0c;物联网整体解决方案供应商移远通信正式宣布&#xff0c;推出符合3GPP NTN R17标准的全新5G卫星通信模组——CC950U-LS。该产品面向国内物联网市场&#xff0c;将为蜂窝网络无法覆盖的森林、海洋、沙漠等偏远地区…

抖音SEO矩阵源码开发(一)

前言&#xff1a; 1.抖音SEO矩阵系统源码开发 是一项技术密集型工作&#xff0c;需要对大数据处理、人工智能等领域有深入了解。该系统开发过程中需要用到多种编程语言在服务器上安装LNMP环境&#xff0c;包括Linux操作系统、Nginx、MySQL、PHP等&#xff0c;如Java、Python等…

CTF安全竞赛介绍

目录 一、赛事简介 二、CTF方向简介 1.Web&#xff08;Web安全&#xff09; &#xff08;1&#xff09;简介 &#xff08;2&#xff09;涉及主要知识 2.MISC&#xff08;安全杂项&#xff09; &#xff08;1&#xff09;介绍 &#xff08;2&#xff09;涉及主要知识 3…

Vue3 刨析响应式原理

ref 目标 了解 Vue &#xff0c;手写一个方法&#xff0c;实现响应式&#xff0c;并读懂响应式 源码 class MyRef {constructor(value) {this._value value}// 访问器get value() {console.log(触发 getter 函数 访问);return this._value}// 读取器set value(newVal) {cons…

基于Android新生预报到系统APP的设计与实现

1.引言 随着国家的教育方针政策的不断改变&#xff0c;自20世纪初以来&#xff0c;政府开始实施扩招计划&#xff0c;截至2020年我国大学生总规模己经攀升至近5000万&#xff0c;大学教育的普及化正在逐渐实现。随着大学新生数量的不断增多&#xff0c;到了每年的9月份&#x…

实现Linux(Ubuntu22.04)与Windows文件互通共享(双方永久往来~)

Samba服务器了解&#xff08;防守&#xff09; Samba是一个开源软件套件&#xff0c;它允许在不同操作系统之间共享文件、打印机和其他资源。它是基于SMB/CIFS协议&#xff0c;这是一种用于在Windows系统中共享文件和打印机的网络协议。Samba服务器可以在Linux、Unix、macOS和…

玩转C++调试之Python的GDB库增强

玩转C调试之Python的GDB库增强 0.导语 调试是软件开发过程中不可或缺的一环&#xff0c;而GDB&#xff08;GNU调试器&#xff09;作为一款功能强大的调试工具&#xff0c;在开发者中得到广泛应用。除了传统的命令行调试功能外&#xff0c;GDB还提供了Python的GDB库&#xff0c;…

2024考研408-计算机组成原理第五章-中央处理器学习笔记

文章目录 前言一、CPU的功能与基本结构1.1、CPU的功能1.2、运算器与控制器需要实现功能1.3、运算器的基本结构1.3.1、基本结构构成&#xff08;七个部分&#xff09;1.3.2、各个部件详细介绍①算数逻辑运算单元②通用寄存器组&#xff08;介绍数据通路的基本结构2个&#xff09…

C语言进阶---字符串+内存函数

本章重点 重点介绍处理字符和字符串的库函数的使用和注意事项。 求字符串长度 strlen() 长度不受限制的的字符串函数 strcpy()strcat()strcmp() 长度受限制的的字符串函数 strncpy()strncat()strncmp() 字符串查找 strstr()strtok() 错误信息报告 strerror() 字符操作内存操作函…

《企业性能测试:体系构建、落地指导与案例解读》——小解送书第四期

目录 介绍 抽奖 介绍 软件系统性能的重要性无须多言&#xff0c;没有哪个用户可以忍受一个响应缓慢的网站或者反应迟钝的软件。软件性能是用户体验的核心。大部分用户可能对软件性能并不了解&#xff0c;但他们永远想使用响应更迅速的软件。所以&#xff0c;性能是评估一个软…

小程序data-*的误区

场景&#xff1a;点击按钮获取data-*的值跳转页面&#xff0c;跳转页获取传过来的参数 binnie: 华哥&#xff0c;为什么有的部分参数传不过去然后显示undefined&#xff1f; 华哥&#xff1a; binnie, 我看了一下你的代码&#xff0c;你错在属性名有大写字母了。我给你写了个…

postman自动生成接口文档

点击&#xff1a; 会自动生成一个文件夹 点击图表&#xff0c;修改名字 新建一个请求&#xff0c;到时候会自动保存到文件夹里面&#xff0c;但是保存前看清楚保存的名字 点击三个点-》点击export即可

Python提取斗鱼美女图片--selenium requests两种方式

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 前言 使用selenium,requests提取斗鱼美女数据 数据来源 斗鱼美女链接 一、selenium是干嘛…

Leetcode-每日一题【206.反转链表】

题目 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5]输出&#xff1a;[5,4,3,2,1] 示例 2&#xff1a; 输入&#xff1a;head [1,2] 输出&#xff1a;[2,1] 示例 3&#xff1a; 输…

ChatGPT助力校招----面试问题分享(七)

1 ChatGPT每日一题&#xff1a;SPI通信协议的四种工作模式 问题&#xff1a;SPI通信协议的四种工作模式 ChatGPT&#xff1a;SPI&#xff08;Serial Peripheral Interface&#xff09;总线是一种同步串行通信协议&#xff0c;它在多种数字系统中得到了广泛应用。SPI总线有四种…