zoukankan      html  css  js  c++  java
  • va_arg实现

    前几天测试的时候,遇到了个问题,顺便看了下printf的实现。

    讲下废话,测试是为了什么呢?几个月前测试6500指令集的我改了下代码,
    目的是为了能让测试通过,好在周末休息下,可是测试就是为了让程序在硬件上
    跑通吗?测试,本身就是为了发现问题,而我在进行指令集的时候却试图改变代码,
    以试图在芯片未流片前就用软件修正自身的问题,可是我们在这个阶段是完全可以
    可以更该一些错误的啊。测试的时候,发现问题很好啊,不然还要测试干嘛……
    废话讲多了,进入正题:printf实现部分的va_start, va_arg, va_end。

    C参数中在栈中的存储方式为从右到左,栈的生长方向为从高到低,无论是大端还是小端,
    低地址都是作为变量的地址。

          1 typedef char * va_list;
          2
          3 #define __INTSIZEOF(n) \
          4     ((sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )
          5
          6 #define __ADDRESS(v) (&(v))
          7
          8 #define va_start(ap, v) \
          9     (ap = (va_list) __ADDRESS(v) + __INTSIZEOF(v))
         10
         11 #define va_arg(ap, t) \
         12     (*(t*)((ap += __INTSIZEOF(t)) - __INTSIZEOF(t)))
         13
         14 #define va_end(ap) \
         15     (ap = (va_list) 0)  

  • 相关阅读:
    redis集群登陆
    锁机制
    关系型数据库事务遵循ACID原则
    前端之Css
    Python之操作redis数据库
    前端之HTML
    Excel之批量改变特定字体颜色(转载)
    jmeter之批量修改请求路径
    Python之time模块
    Python之os模块
  • 原文地址:https://www.cnblogs.com/openix/p/2831113.html
Copyright © 2011-2022 走看看