将结构内的结构传递给GSourceFunc的最佳方法

问题描述:

哪种方式最好将S传递给GSourceFunc?或者既不?将结构内的结构传递给GSourceFunc的最佳方法

typedef struct{ 
//... 
}S; 

struct MS{ 
//.. 
S *St; 
}; 

static gboolean AL_Calback(gpointer data){ 
    S *St = (S*)user_data; 
    St->Something = SomethingElse; 
    return TRUE; 
} 

int main (int argc, char *argv[]){ 

    //... 
    MS *MainStruct = gnew0(MS, 1); 
    Mainstruct->St = gnew0(S, 1); 
    clutter_threads_add_timeout_full(G_PRIORITY_HIGH, 100, AL_Callback, MainStruct->St, NULL); 
    //... 
    } 

或类似这样的,

typedef struct{ 
//... 
}S; 

struct MS{ 
//.. 
S St; 
}; 

static gboolean AL_Calback(gpointer data){ 
    MS *MV = (MS*)user_data; 
    MV->S.something = SomethingElse;  
    return TRUE; 
} 

int main (int argc, char *argv[]){ 

    //... 
    MS *MainStruct = gnew0(MS, 1); 
    clutter_threads_add_timeout_full(G_PRIORITY_HIGH, 100, AL_Callback, MainStruct, NULL); 
    //... 
    } 

我试过其他的方法,但一直没能使其发挥作用。 clutter_add_timeout需要将指针作为参数。

如果通过指针传递参数到clutter_threads_add_timeout_Full,那么你可以只通过的MainStructSt构件从而减少动态分配的需要(对于内部结构)的地址。

struct MainStruct{ 
    //.. 
    S St; // note: no pointer 
}; 

// in main 
MainStruct* ms = gnew0(MS, 1); 
clutter_threads_add_timeout_Full(G_PRIORITY_HIGH, 100, AL_Callback, &(ms->St), 
    NULL); 

编辑:更新的代码动态分配MainStruct结构,以避免可能的段错误如所指出的ptomato

+0

'clutter_threads_add_timeout'不会缝让我过去什么,但一个gpointer,这其实只是'(无效*)'。 – MVTC

+0

@MVTCplusplus - 然后只需在代码后忽略该句子。 a)有一个指针成员并传递该成员之间没有区别。和b)有一个struct成员并传递它的地址(内存分配除外) – Attila

+0

谢谢。我还没有做任何测试,但我想你几乎回答了我的问题。 – MVTC