����14-7 linux/include/stdarg.h


  1 #ifndef _STDARG_H

  2 #define _STDARG_H

  3

  4 typedef char *va_list;  // ����va_list��һ���ַ�ָ�����͡�

  5

  6 /* Amount of space required in an argument list for an arg of type TYPE.

  7    TYPE may alternatively be an expression whose type is used.  */

    /* �������������ΪTYPE��arg�����б���Ҫ��Ŀռ�������

       TYPEҲ������ʹ�ø����͵�һ������ʽ */

  8

    // ������䶨����ȡ�����TYPE���͵��ֽڳ���ֵ����int����(4)�ı�����

  9 #define __va_rounded_size(TYPE)  \

 10   (((sizeof (TYPE) + sizeof (int) - 1) / sizeof (int)) * sizeof (int))

 11

    // ����������ʼ��ָ��AP��ʹ��ָ�򴫸������Ŀɱ�������ĵ�һ��������

    // �ڵ�һ�ε���va_arg��va_end֮ǰ���������ȵ���va_start�ꡣ����LASTARG�Ǻ�������

    // �����ұ߲����ı�ʶ������'...'��ߵ�һ����ʶ����AP�ǿɱ����������ָ�룬LASTARG��

    // ���һ��ָ��������&(LASTARG) ����ȡ���ַ������ָ�룩�����Ҹ�ָ�����ַ����͡�����

    // LASTARG�Ŀ���ֵ��AP���ǿɱ�������е�һ��������ָ�롣�ú�û�з���ֵ��

    // ��17���ϵĺ��� __builtin_saveregs() ����gcc�Ŀ����libgcc2.c�ж���ģ����ڱ���

    // �Ĵ����� ���˵���μ� gcc�ֲᡰTarget Description Macros�����С�Implementing the

    // Varargs Macros��С�ڡ�

 12 #ifndef __sparc__

 13 #define va_start(AP, LASTARG)                                           \

 14  (AP = ((char *) &(LASTARG) + __va_rounded_size (LASTARG)))

 15 #else

 16 #define va_start(AP, LASTARG)                                           \

 17  (__builtin_saveregs (),                                                \

 18   AP = ((char *) &(LASTARG) + __va_rounded_size (LASTARG)))

 19 #endif

 20

    // ����ú����ڱ����ú������һ���������ء�va_end�����޸�APʹ�������µ���

    // va_start֮ǰ���ܱ�ʹ�á�va_end������va_arg�������еIJ������ٱ����á�

 21 void va_end (va_list);          /* Defined in gnulib */  /* ��gnulib�ж��� */

 22 #define va_end(AP)

 23

    // �����������չ����ʽʹ������һ�������ݲ���������ͬ�����ͺ�ֵ��

    // ����ȱʡֵ��va_arg �������ַ����޷����ַ��͸������͡��ڵ�һ��ʹ�� va_argʱ������

    // �ر��еĵ�һ��������������ÿ�ε��ö������ر��е���һ������������ͨ���ȷ���AP��Ȼ

    // ��������ֵ��ָ����һ����ʵ�ֵġ�va_arg ʹ��TYPE ����ɷ��ʺͶ�λ��һ�ÿ����һ

    // ��va_arg�������޸�AP��ָʾ���е���һ������

 24 #define va_arg(AP, TYPE)                           \

 25  (AP += __va_rounded_size (TYPE),                  \

 26   *((TYPE *) (AP - __va_rounded_size (TYPE))))

 27

 28 #endif /* _STDARG_H */

 29