当前位置: 首页 > news >正文

企业网站的模块功能建设银行保定分行网站

企业网站的模块功能,建设银行保定分行网站,网站移动版怎么做,网络推广方案的基本思路为了方便使用#xff0c;GNU C在标准C语言的基础上进行了部分方便开发的扩展。这里讲解一些开发中可能会用到的#xff0c;或者使用频率比较高的内容。零长度数组和变量长度数组GNU C 允许使用零长度数组#xff0c;比如#xff1a;char data[0];GNU C 允许使用一个变量定义… 为了方便使用GNU C在标准C语言的基础上进行了部分方便开发的扩展。这里讲解一些开发中可能会用到的或者使用频率比较高的内容。零长度数组和变量长度数组GNU C 允许使用零长度数组比如char data[0];GNU C 允许使用一个变量定义数组的长度如int n0; scanf(%d,n); int array[n];case 范围GNU C支持 case x...y这样的语法[x,y]之间数均满足条件。case a...z: /*from a to z*/ break;语句表达式GNU C 把包含在括号中的复合语句看作是一个表达式称为语句表达式。 #define min_t(type,x,y)\({type __x(x); type __y(y);__x__y?__x:__y;})这种写法可以避免 #define min_t(x,y) ((x)(y)?(x):(y))在min_t(x,y)中出现的副作用typeof 关键字typeof(x)可以获得x的类型借助typeof关键字我们可以重新定义min_t#define min_t(x,y)\({typeof(x) __x(x); typeof(y) __y(y);__x__y?__x:__y;})可变参数宏GNU C中宏也支持可变参数#define pr_debug(fmt,arg...) \printk(fmt,##arg)这里如果可变参数被忽略或为空“##”操作将使预处理器去掉它前面的那个逗号。如果你在宏调用时确实提供了一些可变参数GNU C也会工作正常它会把这些可变参数放到逗号的后面。标号元素标准C要求数组或结构体的初始化值必须以固定的顺序出现在GNU C中通过指定索引或结构体成员名允许初始化以任意顺序出现。unsigned char data[MAX] {[0]10,[10]100, };struct file_operations ext2_file_operations {open:ext2_open,close:ext2_close, };在linux 2.6中推荐如下方式struct file_operations ext2_file_operations {.readext2_read,.writeext2_write, };当前函数名GNU C中预定义两个标志符保存当前函数的名字__ FUNCTION __ 保存函数在源码中的名字 __ PRETTY__ FUNCTION __保存带语言特色的名字。在C函数中这两个名字是相同的.void func_example() {printf(the function name is %s,__FUNCTION__); }在C99中支持__ func __ 宏因此建议使用 __ func __ 替代 __ FUNCTION __ 。特殊属性声明GNU C 允许声明函数、变量和类型的特殊属性以便进行手工的代码优化和定制。如果要指定一个属性声明只需要在声明后添加__ attribute __((ATTRIBUTE))。其中ATTRIBUTE为属性说明如果存在多个属性则以逗号分隔。GNU C 支持noreturnnoinline always_inline pure const nothrow format format_arg no_instrument_function p constructor destructor used unused deprecated weak malloc alias warn_unused_result nonnull等十个属性。noreturn属性作用于函数表示该函数从不返回。这会让编译器优化代码并消除不必要的警告信息。例如#define ATTRIB_NORET __attribute__((noreturn)) .... asmlinkage NORET_TYPE void do_exit(long error_code) ATTRIB_NORET;packed属性作用于变量和类型用于变量或结构域时表示使用最小可能的对齐用于枚举、结构或联合类型时表示该类型使用最小的内存。如对于结构体就是它告诉编译器取消结构在编译过程中的优化对齐按照实际占用字节数进行对齐。例如struct example_struct {char a;int b;long c; } __attribute__((packed));regparm属性用于指定最多可以使用n个寄存器eax, edx, ecx传递参数n的范围是0~3超过n时则将参数压入栈中n0表示不用寄存器传递参数。注意以上这些属性都是在X86处理器体系结构下的在X64体系结构下大部分内容都是同样有效的。但是这里要注意regparm属性由于在X64体系结构下GUN C的默认调用约定使用寄存器传递参数。所以如果regparm属性里使用的寄存器个数超过3个也仍然会使用其他寄存器来传递参数。这一点要遵循X64体系结构的调用约定。下面可以看一个例子。int q 0x5a; int t1 1; int t2 2; int t3 3; int t4 4; #define REGPARM3 __attribute((regparm(3))) #define REGPARM0 __attribute((regparm(0))) void REGPARM0 p1(int a) {q a 1; }void REGPARM3 p2(int a, int b, int c, int d) {q a b c d 1; }int main() {p1(t1);p2(t1,t2,t3,t4);return 0; }使用objdump命令反汇编相关命令如下objdump -D 可执行程序其中-D选项用于反汇编所有的程序段包括代码段、数据段、只读数据段以及一些系统段等等。而-d命令只反汇编代码段的内容。反汇编后的关键代码如下Disassembly of p .text: 0000000000400474 p1:400474: 55 push %rbp400475: 48 89 e5 mov %rsp,%rbp400478: 89 7d fc mov %edi,-0x4(%rbp)40047b: 8b 45 fc mov -0x4(%rbp),%eax40047e: 83 c0 01 add $0x1,%eax400481: 89 05 3d 04 20 00 mov %eax,0x20043d(%rip) # 6008c4 q400487: c9 leaveq 400488: c3 retq 0000000000400489 p2:400489: 55 push %rbp40048a: 48 89 e5 mov %rsp,%rbp40048d: 89 7d fc mov %edi,-0x4(%rbp)400490: 89 75 f8 mov %esi,-0x8(%rbp)400493: 89 55 f4 mov %edx,-0xc(%rbp)400496: 89 4d f0 mov %ecx,-0x10(%rbp)400499: 8b 45 f8 mov -0x8(%rbp),%eax40049c: 8b 55 fc mov -0x4(%rbp),%edx40049f: 8d 04 02 lea (%rdx,%rax,1),%eax4004a2: 03 45 f4 add -0xc(%rbp),%eax4004a5: 03 45 f0 add -0x10(%rbp),%eax4004a8: 83 c0 01 add $0x1,%eax4004ab: 89 05 13 04 20 00 mov %eax,0x200413(%rip) # 6008c4 q4004b1: c9 leaveq 4004b2: c3 retq 00000000004004b3 main:4004b3: 55 push %rbp4004b4: 48 89 e5 mov %rsp,%rbp4004b7: 53 push %rbx4004b8: 8b 05 0a 04 20 00 mov 0x20040a(%rip),%eax # 6008c8 t14004be: 89 c7 mov %eax,%edi4004c0: e8 af ff ff ff callq 400474 p14004c5: 8b 0d 09 04 20 00 mov 0x200409(%rip),%ecx # 6008d4 t44004cb: 8b 15 ff 03 20 00 mov 0x2003ff(%rip),%edx # 6008d0 t34004d1: 8b 1d f5 03 20 00 mov 0x2003f5(%rip),%ebx # 6008cc t24004d7: 8b 05 eb 03 20 00 mov 0x2003eb(%rip),%eax # 6008c8 t14004dd: 89 de mov %ebx,%esi4004df: 89 c7 mov %eax,%edi4004e1: e8 a3 ff ff ff callq 400489 p24004e6: b8 00 00 00 00 mov $0x0,%eax4004eb: 5b pop %rbx4004ec: c9 leaveq 4004ed: c3 retq 4004ee: 90 nop4004ef: 90 nopDisassembly of p .data: 00000000006008c0 __data_start:6008c0: 00 00 add %al,(%rax)...00000000006008c4 q:6008c4: 5a pop %rdx6008c5: 00 00 add %al,(%rax)...00000000006008c8 t1:6008c8: 01 00 add %eax,(%rax)...00000000006008cc t2:6008cc: 02 00 add (%rax),%al...00000000006008d0 t3:6008d0: 03 00 add (%rax),%eax...00000000006008d4 t4:6008d4: 04 00 add $0x0,%al...如果读者还记得2.2.3节中关于GCC基于X64体系结构的调用约定的话那就很容易可以看出函数p1和p2都使用寄存器传递参数顺序就是RDI RSI RDX RCX这些细节已经跟regparm的规定完全不一致了。所以在这里作者觉得regparm已经不起作用了。转自https://my.oschina.net/LinuxDaxingxing/blog/751319推荐阅读专辑|Linux文章汇总专辑|程序人生专辑|C语言我的知识小密圈关注公众号后台回复「1024」获取学习资料网盘链接。欢迎点赞关注转发在看您的每一次鼓励我都将铭记于心~嵌入式Linux微信扫描二维码关注我的公众号
http://www.pierceye.com/news/302746/

相关文章:

  • 专业网站设计学校空间放两个网站
  • 万户网站建设网站流量突然增加
  • 中山住房和建设局网站小程序搭建的方式
  • 网站标题怎么做游戏推广工作好做吗
  • 网页设计制作网站模板免费静态网页设计模板免费
  • 成都的网站建设开发公司黄石网站建
  • 便宜的做网站公司网上下载的网页模板怎么用
  • 网站开发制作软件网站运营推广主要做什么的
  • 网页设计怎么建立网站网站馆店精准引流怎么推广
  • iis6建设网站上海到北京飞机航班查询
  • 做网站 创业 流程什么是网站标题
  • 怎么查询菠菜网站做没作弊沙朗做网站公司
  • 网站的建设周期与阶段广州王牌seo
  • 连江建设局网站手机网站建设套餐内容
  • 收录网站排名wordpress 搜索过滤
  • 上海网站建设代码长春又出现一例
  • 国外包装设计欣赏网站wordpress4.9.4环境要求
  • 免费域名网站查询好的营销网站设计公司
  • 网站说服力在百度上怎么建立网站
  • 医疗网站模板下载qq音乐的网站建设信息
  • 商务网站开发的的基本流程网站 设计 趋势
  • php mysql网站开发实例卖货平台排名前十
  • 房地产管理局网站建设银行北京市分行网站
  • 无锡哪家网站做的好黄骅市人事考试网
  • 芜湖seo网站优化淘宝官网首页手机版
  • 用付费网站做推广ui网站一般建好大
  • 四川建设行业网站有哪些最新体育新闻头条
  • 湘潭网站优化公司wordpress会员积分邀请
  • 腾讯网静态网站建设西宁网站建设公司排行
  • pc网站优势买完网站怎么建设