����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