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)  

  • 相关阅读:
    用C#新建网站的方法
    zhngutils.js
    jQuery源代码学习jQuery对象构建
    前端性能书单
    预则成,不预则废
    表格
    js延时周期执行setTimeout;setInterval;clearTimeout;clearInterval
    url备份
    前端性能集合(各种测试各种资源...)
    Scrum开发模式
  • 原文地址:https://www.cnblogs.com/openix/p/2831113.html
Copyright © 2011-2022 走看看