首先void *可以包容各种类型,所以图中两个强制类型转换(void*)去掉也不会有warning。
对于你的问题,其实也就是因为在rt_thread结构体中变量sp和entry都声明为(void *),所以问题就变为:为什么声明为void*?
void *可以包容各种类型,这只是ANSI/GNU的规定,所以赋值时也可以不强制类型转换。指针变量大小与所用的机器有关,32位机中是32位,64位机中是64位,即等于大小等于其存储器的位宽。你可以自己sizeof一下char *、int *、void *等,在32位机中都等于4,64位机中都等于8。这也很好理解,指针保存的是地址,而指针的长度自然就等于CPU接的存储器的地址总线宽度。
这里看一个简单的例子:
char a = 'a';
//void包容所有类型,所以(void*)&a前面的(void*)不加也不会有warning
void *b = &a;
//使用时需要转化为原来的类型
printf("%c",*(char*)b);
此时假设a的地址是0x10,则*(char*)b代表的就是0x10开始的sizeof(char)=1字节内容,*(*short)b代表的就是0x10开始的sizeof(short)=2字节(32位机)内容。所以要使用时根据原来变量的类型强制转换就行了。
对于rt_thread的成员sp和entry声明为(void *),可以理解为是为了兼容,比如rt_hw_stack_init函数中传的entry参数的类型为void (*)(*void),那么rt_thread中的的这一行void * entry完全可以声明为void (*entry)(*void),那如果以后想让这个函数不带参数呢,又要去rt_thread中将void (*entry)(*void)改为void (*entry)(void),又要改rt_hw_stack_init的参数,这样就不如直接声明为void *来得方便。使用这个函数的时候只需要强制类型转换即可使用:
void (*func)(*void) = (void (*)(*parameter))rt_thread.entry;
func(parameter);//即调用rt_hw_stack_init中设置的entry函数
这样可能不太好理解,所以一般用typedef
typedef void (*fp)(*void);
fp func = (fp)re_thread.entry;
func(parameter);
首先void *可以包容各种类型,所以图中两个强制类型转换(void*)去掉也不会有warning。
对于你的问题,其实也就是因为在rt_thread结构体中变量sp和entry都声明为(void *),所以问题就变为:为什么声明为void*?
void *可以包容各种类型,这只是ANSI/GNU的规定,所以赋值时也可以不强制类型转换。指针变量大小与所用的机器有关,32位机中是32位,64位机中是64位,即等于大小等于其存储器的位宽。你可以自己sizeof一下char *、int *、void *等,在32位机中都等于4,64位机中都等于8。这也很好理解,指针保存的是地址,而指针的长度自然就等于CPU接的存储器的地址总线宽度。
这里看一个简单的例子:
char a = 'a';
//void包容所有类型,所以(void*)&a前面的(void*)不加也不会有warning
void *b = &a;
//使用时需要转化为原来的类型
printf("%c",*(char*)b);
此时假设a的地址是0x10,则*(char*)b代表的就是0x10开始的sizeof(char)=1字节内容,*(*short)b代表的就是0x10开始的sizeof(short)=2字节(32位机)内容。所以要使用时根据原来变量的类型强制转换就行了。
对于rt_thread的成员sp和entry声明为(void *),可以理解为是为了兼容,比如rt_hw_stack_init函数中传的entry参数的类型为void (*)(*void),那么rt_thread中的的这一行void * entry完全可以声明为void (*entry)(*void),那如果以后想让这个函数不带参数呢,又要去rt_thread中将void (*entry)(*void)改为void (*entry)(void),又要改rt_hw_stack_init的参数,这样就不如直接声明为void *来得方便。使用这个函数的时候只需要强制类型转换即可使用:
void (*func)(*void) = (void (*)(*parameter))rt_thread.entry;
func(parameter);//即调用rt_hw_stack_init中设置的entry函数
这样可能不太好理解,所以一般用typedef
typedef void (*fp)(*void);
fp func = (fp)re_thread.entry;
func(parameter);
举报