printf()初解

C: printf

int __cdecl printf(
const char* format,
...
) // ... 叫可变长参数
/*
* stdout 'PRINT' , 'F'ormatted
*/
{
#ifdef _M_ALPHA
typedef struct {
char *a0; /* pointer to first homed integer argument */
int offset; /* byte offset of next parameter */
} va_list;
/*
* _M_ALPHA是指DEC ALPHA(Alpha AXP)架构。所以一般情况下va_list所定义变量为字符指针。
*/
#else
typedef char * va_list;
#endif
va_list arglist;

int buffing;
int retval

#define _INTSIZEOF(n) ((sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) -1))
/*
* 此处时为了内存对齐,不妨令char = 5
* 获取类型占用的空间长度,最小占用长度为int的整数倍
* 例子: _INTSIZEOF(char)
* sizeof(char[]) = 5
* sizeof(int)+sizeof(int)-1 = 8
* 1000B & ~ 0011B
 * 1000B & 1100B = 1000B = 8 ,为 int 的2倍
--------------------------------------------
数学推理:
((L + n - 1) /n)* n
L:数据长度 n为对准长度,此处为sizeof(int)
/ n * n 为 & ~(sizeof(int) -1))
/ n * n 的作用为对准, 在二进制后表现 n - 1的置1位 为0(因为是2的倍数),此处 siezof(int) = 4 = 0100B
4 - 1 = 0011B
取反后方便置1位置0 为:111...1100
相与后得结果为整数倍

--------------------------------------------
*
*/

#define va_start(ap,v) ( ap = (va_list)&v + _INTSIZEOF(v) )
/*
* 获取第一个参数的地址,此时format为字符串,不为0
*/
va_start(arglist,format);

_ASSERTE (format != NULL);
/*
* 调用_ASSERT,_ASSERTE宏来测试条件 。 如果条件失败,则这些宏会打印诊断消息。
*
*/
#define _lock_str2(i,s) _lock_file2(i,s)
void __cdecl _lock_file2(int, void *);
#define _unlock_str2(i,s) _unlock_file2(i,s)
void __cdecl _unlock_file2(int, void *);
int __cdecl _stbuf(FILE *);
void __cdecl _ftbuf(int, FILE *);
int __cdecl _output(FILE *, const char *, va_list);
/*
* 在_output()函数中,读取格式字符串中的每一个字符,然后对其进行处理,处理方式根据每一个字符所代表的意义来进行,如:普通字符直接利用函数WRITE_CHAR(ch, &charsout);输出到控制台。
*/

_lock_str2(1, stdout);

retval = _output(stdout, format, arglist);

/*
* buffing = _stbuf(stdout);
* This function is mainly to initialize a buffer, to prepare for the conversion and printing. The size of buffer is 4,096 bytes. If the function succeeds, its return value is 1.
* 这个函数主要是用来初始化缓冲,去准备写入和打印,这个缓冲区大小大概有4,096个字节,如果成功将返回值1
*/
_ftbuf(buffing, stdout);

_unlock_str2(1, stdout);

return(retval);
}

posted @ 2021-12-30 13:37  焱啟㙓  阅读(65)  评论(0)    收藏  举报