c语言很是出神
这是在RTT里看见的,觉得有意思就贴上来了。#define _OBJ_CONTAINER_LIST_INIT(c) \{&(rt_object_container.object_list), &(rt_object_container.object_list)}
struct rt_object_information rt_object_container =
{
/* initialize object container - thread */
{RT_Object_Class_Thread, _OBJ_CONTAINER_LIST_INIT(RT_Object_Class_Thread), sizeof(struct rt_thread)},
#ifdef RT_USING_SEMAPHORE
/* initialize object container - semaphore */
{RT_Object_Class_Semaphore, _OBJ_CONTAINER_LIST_INIT(RT_Object_Class_Semaphore), sizeof(struct rt_semaphore)},
#endif
...
};
定义了一个rt_object_container结构体,并给结构体赋初值,而在赋初值时又调用这个结构体本身了;有点想不明白这里的过程。/**
* The information of the kernel object
*/
struct rt_object_information
{
enum rt_object_class_type type; /**< object class type */
rt_list_t object_list; /**< object list */
rt_size_t object_size; /**< object size */
};还有赋初值当中又给成员变量赋初值;一环套一环啊
这样使用我真没有见过,可能少见多怪了 {:lol:} 这个和c语言的赋初值的原理相关。 rt_object_container 定义到之后其内存空间就分配好了,那么他内部对应的变量的地址都约定好了。
rt_object_container的赋值动作时在运行时库进行的(可能),那么就可以引用相关的地址了。其实最终一步是由编译器完成,一步由代码完成。这里理解后就没有嵌套关系了。个人粗浅的理解。
页:
[1]