__attribute__机制

news/2024/11/8 23:44:52/

__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, ...)
#endiftypedef 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, ...)
#endifstruct 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, ...)
#endifstruct 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.ppmy.cn/news/673927.html

相关文章

2018年度硬件–Apple Watch Series 4、Xbox等自适应控制器

回顾即将过去的 2018 年&#xff0c;智能硬件设备的「创新」愈发显得弥足珍贵&#xff0c;这是过去几年 ifanRank 年度设备评选中反复提及的调论&#xff0c;但在此基础上&#xff0c;今年的情况仍有些不一样。 2018 年&#xff0c;我们希望把目光聚焦在一些能够打动人心的产品…

[转载] 苹果 AppStore 应用商店生存之道

(转载自 cocoachina) 1、整体市场 我准备写至少两篇。本篇为对iPhone的整体的看法。以后会写对中国AppStore市场的看法&#xff0c;市场销售的看法&#xff0c;和在中国开发的看法。 先自我介绍。我从08年9月就开始做iPhone。之前做PC的软件&#xff0c;做得没有意思了&#xf…

手机游戏的发展及其上升空间

近期我阅读了由腾讯质量开放平台发布的基于2017年度腾讯WeTest质量开发平台测试数据、应用宝数据、腾讯应用宝数据以及其他第三方平台数据&#xff0c;着重从市场硬件、兼容、客户端性能、服务器性能、安全、用户口碑等手游开发者最关注的手游研发质量视角进行深刻洞察与深入分…

android 小屏模式吗,宅在家又嫌手机屏幕小?教你如何玩转投屏

在这个「加长版」寒假当中&#xff0c;相信许多人想要把手机里的小屏幕投影到大屏幕当中&#xff0c;享受一下在电视机当中玩手游的乐趣。之前曾经有厂商表示 5G 网络可以实现该这个功能&#xff0c;但是通过家里的路由器和智能电视(智能机顶盒)&#xff0c;我们也可以轻松完成…

用计算机玩游戏的视频教程,手机飞屏玩电脑游戏 观看电脑视频教程

原标题&#xff1a;手机飞屏玩电脑游戏 观看电脑视频教程 大家好啊&#xff01;&#xff0c;今天给大家推荐几款&#xff0c;手机串流的VR软件&#xff0c;还是老样子&#xff0c;虎虎VR只做最专业的教程与评测&#xff0c;所以接下来的教程&#xff0c;我会尽量的写的大家看的…

ios手柄研究

1.验证MFI&#xff1a;没有苹果认证的硬件芯片&#xff0c;蓝牙无法连接。 BLE4.0除外&#xff0c;MFi是苹果的一个开发者计划&#xff0c;针对硬件的。硬件和app配合使用。所以审核app肯定也很严格。因为MFi的硬件和app都要审核,app里用到蓝牙的。 在操作moga手柄时玩appstore…

Pico 4 爆了,但没完全爆

作者 | 辰纹 来源 | 洞见新研社 谈起元宇宙&#xff0c;Pico是无法忽略的存在。 Pico的高关注度不光光持续走高的出货量&#xff0c;更在于其在字节跳动元宇宙宏图大业中的核心地位。 数据显示&#xff0c;今年Q2&#xff0c;Pico总计卖出超过50万台VR头显产品&#xff0c;仅…

xbox手柄测试_【喂你播】苹果官网上架Xbox无线手柄,那么未来会有果牌手柄吗?...

BGM&#xff1a;VORACITY - MYTH & ROID OPPO Reno Ace 正式发布 期盼已久的 OPPO Reno Ace终于正式发布&#xff0c;新机首发 65W SuperVOOC 2.0 超级闪充&#xff0c;内置骁龙 855 Plus 12GB 大内存&#xff0c;标配 90Hz电竞屏幕&#xff0c;售价方面&#xff0c;8GB128…