On 10/13/2010 05:06 PM, wilbur.chan wrote:
I am planning to use va_list on a single module, however the following code did not work properly. typedef char * va_list; #define _INTSIZEOF(n) ( (sizeof(n) + sizeof(int) - 1)& ~(sizeof(int) - 1) ) #define va_start(ap,v) ( ap = (va_list)&v + _INTSIZEOF(v) ) #define va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) ) #define va_end(ap) ( ap = (va_list)0 )
You cannot arbitrarily define those macros with garbage and expect anything to work.
Replace all the above code with #include <stdarg.h> Then do: man stdarg That documents how it works. David Daney
void test_val_list() { unsigned long test=0x1234; test_printk("test:0x%x OK\n",aaa); } void test_printk(const char *format, ...) { va_list args; va_start(args, format); unsigned int v1 = va_arg(args,unsigned long); printk("v1 is 0x%x\n",v1); unsigned int v2 = va_arg(args,unsigned long); printk("v2 is 0x%x\n",v2); } The result is : v1 is 0x00000013 v2 is 0x00000019 Why this happened ? shouldn't v1 be 0x1234 here? Thank you