lindabell 发表于 2012-5-8 15:55:10

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:}

acmilannast 发表于 2012-5-24 22:14:00

这个和c语言的赋初值的原理相关。 rt_object_container 定义到之后其内存空间就分配好了,那么他内部对应的变量的地址都约定好了。
rt_object_container的赋值动作时在运行时库进行的(可能),那么就可以引用相关的地址了。其实最终一步是由编译器完成,一步由代码完成。这里理解后就没有嵌套关系了。个人粗浅的理解。
页: [1]
查看完整版本: c语言很是出神