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

    文章

    11204

    浏览量

    208701
  • 操作系统
    +关注

    关注

    37

    文章

    6676

    浏览量

    123131
  • 编译器
    +关注

    关注

    1

    文章

    1617

    浏览量

    49014

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

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

收藏 人收藏

    评论

    相关推荐

    Linux系统中多个同类设备共用一套驱动

    比如我们的设备上有很多样的usb接口,这些usb接口都需要有驱动才能工作,那么是每个usb都一套单独的驱动程序么?显然不是的,这些usb接口属于同类设备,用户对他们的操作方法
    发表于 08-30 09:29 827次阅读
    Linux<b class='flag-5'>系统</b>中多个同类设备共用<b class='flag-5'>一套</b>驱动

    手机操作系统成功的秘密

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

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

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

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

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

    什么是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 1403次阅读

    Linux操作系统基本使用知识,Linux操作系统操作流程图文详解

    Linux系统一般有4个主要部分:内核、shell、文件系统和应用程序。内核、shell和文件系统一起形成了基本的操作系统结构,它们使得用户可以运行程序、管理文件并使用
    发表于 11-24 16:19 1.8w次阅读
    Linux<b class='flag-5'>操作系统</b>基本使用知识,Linux<b class='flag-5'>操作系统</b><b class='flag-5'>操作</b>流程图文详解

    Linux操作系统在定制PMP DM320的应用解析

    Linux是一套免费使用和自由传播的类Unix操作系统,是个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。PM
    发表于 11-30 14:21 939次阅读

    微软全新操作系统正在开发 或在5月Build大会亮相

    关于微软全新的一套操作系统Windows Lite有了新的动态。
    的头像 发表于 03-05 09:07 2035次阅读

    APL库是一套AS功能库与OS操作对象的集合

    首先,在AS控制器侧,它是个MotL功能块(Function Block);在OS侧,它却是此功能块对应的电机图标(Block Icon)和一套操作面板(Faceplate),APL定义了
    的头像 发表于 12-05 14:31 5929次阅读
    APL库是<b class='flag-5'>一套</b>AS功能库与OS<b class='flag-5'>操作</b>对象的集合

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

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

    一套成熟的MES系统能卖多少钱

    对于MES系统价格来说,相信很多企业都给不出个确定的答案,毕竟现在的MES系统市场上类型较多,功能不,几万到几百万的系统比比皆是,但是要
    发表于 09-30 17:45 3445次阅读

    一套系统的网络排错方法

    为什么要先讲必备条件?因为这里所讲的网络排错并不仅仅是停留在某个小小命令的使用上,而是一套系统的方法,如果没有这些条件,真的不能保证下面聊的这些可以听得懂,并且能运用到实际当中,所以
    的头像 发表于 11-10 09:56 652次阅读

    linux属于什么操作系统

    Linux属于种类UNIX操作系统。Linux,全称GNU/Linux,是一套免费使用和自由传播的类Unix操作系统,是
    的头像 发表于 11-08 11:01 4120次阅读