0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

一套完全自由的操作系统都有这个秘密

UtFs_Zlgmcu7890 来源:互联网 作者:佚名 2017-09-27 13:56 次阅读

GNU计划,又称革奴计划,是由Richard Stallman1983927日公开发起的。它的目标是创建一套完全自由的操作系统,它在编写Linux的时候自己制作了一个标准成为GNU C标准,但是作为GNU C一大特色的__attribute__机制却为许多人所不知,现在让我们一起走进__attribute__的世界,来揭开它的神秘面纱。

对于GNU C的__attribute__机制,它有什么神奇的作用呢?你们是不是已经迫不及待了,对于__attribute__它可以修饰变量属性和函数属性,它的语法格式为:“__attribute__((参数));”,下面我们慢慢道来。

当我们初次学习一门语言的时候,都会写一个很经典的程序,没错就是在屏幕上输出Hello world,现在对我们来说写一段hello world程序,都是顺手捏来的事了,那么你看过这样的Hello world吗?

#include

#include

__attribute__((constructor())) void pre_proc_1(void)

{

printf("\nhello world\n");

}

__attribute__((destructor())) void end_proc_1(void)

{

printf("\nHello World\n",__LINE__);

}

int main(int args,char **argv)

{

return 0;

}

可以猜到程序输出什么结果吗?没错也是输出Hello world,直到为什么这样吗?细心的人肯定看到了在两个子函数前面使用了__attribute__((constructor()))和__attribute__((destructor))来修饰子函数,那么它们的作用是什么意思呢?被__attribute__((constructor()))修饰的函数在主函数前执行,__attribute__((destructor()))修饰的函数在主函数后执行,我们还可以在__attribute__((constructor(101)))在数字,括号中的数字代表函数的优先级,这样我们就可以安排我们函数执行的顺序了,一般0-100为系统使用,我们可以使用100以后的数字,在VC下也有这个属性但是不能添加数字作为优先级,但是我们可以安排我们函数的声明顺序来实现函数的执行顺序。

经过一个简单有意思的程序,下面我们继续来说__attribute__机制,在前面说道__attribute__可以修饰变量和函数属性,下面总结了如何使用__attribute__来修饰变量和函数,让我们一起来感受它的神奇。

函数属性

(1)__attribute__((format(archtype,string-index,first-to-check)));

format属性告诉表达式按照printf,scanf,strftime,strfmom参数表格式规则对该函数的参数进行检查。

例:

__attribute__((format(printf,m,n)));

__attribute__((format(scanf,m,n)));

m:第几个参数为格式化字符

n;在参数集合中排在第几

(2)__attribute__((noreturn));

该属性通知编译器从不返回值,当遇到类似函数需要返回值却不可能运行到返回值就已经退出的情况该属性可以避免出现错误信息,例如C语言中的abort()和exit()函数就使用到了该属性。

(3)__attribute__((const));

该属性只能用于带有数值类型参数的函数上,当反复调用带有数值参数的函数时,由于返回值是相同的,所以编译器可以进行优化处理,除第一次需要运算外,其他只需返回第一次运行的结果,进而再快了执行效率。

(4)Noinline & always_line

Nolinline为不内联,always_line为总是内联,我们在使用inline什么内联函数时,函数能否成为内联函数,还要看编译器的具体操作,使用noinline和always_line可以告诉编译器是否执行内联。

(5)看了前面的常用属性,你们可能会问到可以在同一个函数中使用多个参数吗?回答是肯定,并且这在实际中也是非常有用的。

变量属性

(1)__attribute__((aligned(n)));

例:

int a __attribute__((aligned(16))) = 0;

变量a将以16位对齐,我们也可以不加数字,如__attribute__((aligned));这样编译器会根据目标机器的情况实现对齐。它不仅可以修饰单个变量,也可以修饰符合变量如结构体,联合等,在实际中会用于修饰结构体,是结构体中的成员按一定的方式字节对齐。

(2)__attribute__((packed));

例:

int a[10] __attribute__((packed));

前面说了字节对齐属性,有的编译会默认使用一种字节对齐方式,假如我们不想使用字节对齐该怎么做呢?该属性就起到了这个作用,使用packed可以取消字节对齐方式。

(3)__attribute__((at(address));

例:

int a __attribute__((at(0x00));

在一些特殊的情况,我们需要将某个变量存放特定的位置时,该属性就起到了作用,该属性的作用就是将变量a存储到绝对地址为0x00的位置处。

(4)__attribute__((section(“section_name”)));

例如:

int a(void) __attribute__((seciton(abc));

说了前面的at属性,现在我们来说seciton属性,他和at有些相同,他的作用是将作用的函数或指定的数据放入指定名为Section_name的段中,一般在汇编文件中我们会使用到。

(5)__attribute__((cleanup(函数名)))

该属性来修饰一个变量,当变量的作用域结束时,调用一个指定的函数。

例如:

void print()(printf(“\nend\n”);

void text()

{

Int a __attribute__((cleanup(print))) = 10;

}

看了这么多属性的作用,大家是否感觉到了GNU编译器的神奇呢?对于__attribute__关键字,大家是否有了更进一步的认识呢?

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    87

    文章

    10978

    浏览量

    206672
  • 操作系统
    +关注

    关注

    37

    文章

    6264

    浏览量

    121841
  • 编译器
    +关注

    关注

    1

    文章

    1570

    浏览量

    48598

原文标题:__attribute__ 你不知道的秘密

文章出处:【微信号:Zlgmcu7890,微信公众号:周立功单片机】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    手机操作系统成功的秘密

    和Android成功了?为什么Bada有三星这么强大的硬件支持依然被边缘化?手机操作系统成功的秘密又是什么呢?、iOS的成功我们先来看下成功的
    发表于 07-12 08:37

    操作系统发展历史

    工作的计算机科学家KenThompson,在台无人使用的PDP-7机器上开发出了一套简化的、单用户版的MULTICS。后来导致了UNIX操作系统的诞生。目前UNIX操作系统主导了小型
    发表于 09-13 10:10

    Linux与其他操作系统的区别

    ,而其他操作系统都是封闭的系统,需要有偿使用。这区别使得我们能够不用花钱就能得到很多Linux的版本以及为其开发的应用软件。当我们访问Internet时,会发现几乎所有可用的自由软件
    发表于 09-13 10:12

    关于国内实时操作系统的接口标准统

    。具体说明如下: 1 定义一套实时操作系统的抽象层接口。这套抽象层接口首先要能满足国外的些主流实时系统的封装。比如: task_create_cn(……….){Ucos3_task_
    发表于 06-01 10:13

    【Aworks申请】物联网操作系统

    。为了解决这个问题,我决定边学习边开发一套全新的轻量级的操作系统。项目描述:我将这个物联网
    发表于 07-09 11:04

    嵌入式微内核实时操作系统的Wolf测试怎么实现?

    介绍嵌入式微内核实时操作系统的体系结构;针对Wolf嵌入式操作系统,设计一套微内核嵌入式操作系统测试实现方案。在Wolf操作系统支持下,已产
    发表于 09-05 06:03

    UCOS-II操作系统在ZEVIO1020上的移植过程是怎么样的?

    近年来,随着嵌入式技术的不断发展,各种电子产品层出不穷,对于那些具有众多功能,但按键数目无法满足要求的设备来说,选择个好的操作系统和设计一套合理的消息处理机制,已经成为研发人员研究的
    发表于 11-07 07:24

    如何制作一套波形发生系统

    本设计中涉及到单片机汇编语言、VHDL语言的运用,充分地利用了二者的优点,制作了一套波形发生系统
    发表于 04-21 06:09

    一套伺服驱动系统

    任务某设备上有一套伺服驱动系统,伺服驱动器的型号为MR-J2S,伺服电动机的型号为HF-KE13W1-S100,是三相交流同步伺服电动机,要求:压下按钮SB1时,伺服电动机带动系统X方向移动,碰到
    发表于 09-02 06:36

    什么是UNIX操作系统

    @TOC嵌入式方向在校目前所学到的知识**欢迎使用Markdown编辑器Linux概述linux是一套免费使用和自由传播的类UNIX操作系统。对于类UNIX操作系统,我并不是很了解,通
    发表于 11-04 07:29

    分享一套通用的开发环境搭建教程

    针对嵌入式的开发,不同的开发者使用不同的操作系统,可能是Windows 或者 Linux,随之而来所搭建的开发环境亦不同。所以在这里希望分享一套通用的开发环境搭建教程,主要是围绕VS Code以及
    发表于 11-05 06:23

    什么是Linux操作系统

    什么是Linux操作系统  简单地说,Linux是一套
    发表于 12-26 12:04 1371次阅读

    Linux操作系统的详细安装步骤

    Linux是一套免费使用和自由传播的操作系统,它主要用于基于Intel x86系列CPU的计算机上。这个系统是由全世界各地的成千上万的程序员
    发表于 07-16 11:39 4402次阅读

    什么是Linux及其操作系统的特点

    Linux,全称GNU/Linux,是一种免费使用和自由传播的类UNIX操作系统,其内核由林纳斯·本纳第克特·托瓦兹于1991年10月5日首次发布,它主要受到Minix和Unix思想的启发
    的头像 发表于 01-30 17:30 2843次阅读

    linux属于什么操作系统

    Linux属于一种类UNIX操作系统。Linux,全称GNU/Linux,是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和Unix的多用户、多任务、支持多线程和多C
    的头像 发表于 11-08 11:01 1610次阅读