这个代码算原创有些勉强,不管怎样粘过去,可以用在win下调试的,我看过这个后,尽管仍然有很多迷惑,不过觉得比以前更直观了,有了那么一点点感觉。
#include <stdio.h>
typedef char *va_list;
// 此处代码看了两种不同的实现,最后发现其实应该是一样的,当然也把不一样的写在注释里面了
#define INTSIZEOF(n) (((sizeof(n)+sizeof(int)-1)/sizeof(int)) * sizeof(int)) // ((sizeof(n)+sizeof(int)-1)&~(sizeof(int)-1))
#define va_start(ap,v) (ap=((va_list)&(v)+INTSIZEOF(v)))
#define va_arg(ap,t) ((ap += INTSIZEOF(t)),( *(t *)(ap - INTSIZEOF(t)) ) ) //( *(t *)((ap += INTSIZEOF(t)) - INTSIZEOF(t)) )
#define va_end(ap) (ap=(va_list)0)
int myprintf(char *buf, char *fmt, ...);
int main(void){
printf("%d\n", INTSIZEOF(char));
printf("%d\n", INTSIZEOF(int));
printf("%d\n", INTSIZEOF(short));
char buf[500];
myprintf(buf, "s d c d , s ? s", "are", 5, 'A', 5, "HEllo, wolrd!", "my name is ideal");
return 1;
}
int myprintf(char *buf, char *fmt, ...) {
va_list ap;
va_start(ap, fmt);
int d;
char c, *s;
while (*fmt) {
switch (*fmt++)
{
case 's': /* string */
s = va_arg(ap, char *);
printf("string %s\n", s);
break;
case 'd': /* int */
d = va_arg(ap, int);
printf("int %d\n", d);
break;
case 'c': /* char */
/* need a cast here since va_arg only
takes fully promoted types */
c = (char) va_arg(ap, int);
printf("char %c\n", c);
break;
case ' ':
printf("| |\n");
break;
case ',':
printf(",\n");
break;
case '?':
goto exit;
break;
}
}
exit:
va_end(ap);
}