如何编写结构体指针类型转换宏?编译报错求助
自定义结构体指针类型转换宏的编译错误解决方法
首先看你的结构体定义:
typedef struct _AppData { GtkWidget* toplevel; // main window GtkWidget* view; // column style view GtkWidget* entry_outdir; // output dir GtkWidget* entry_artist; // artist GtkWidget* entry_title; // title GtkWidget* entry_link; // link GtkWidget* check_jman; // bool for jman GtkWidget* menuitem_clear; // init states GtkWidget* menuitem_action; // play/stop menu item } AppData, *PAppData;
你在信号回调里尝试用自定义宏转换gpointer参数:
g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (cb_select_folder), pad); void cb_select_folder (GtkButton* sender, gpointer user_data) { PAppData pad = PAPPDATA(user_data); // 此处使用类型转换宏 const gchar* dirname = gtk_entry_get_text (GTK_ENTRY(pad->entry_outdir)); // .. }
你定义的宏是:
#define PAPPDATA(_in_) (PAppData(_in_))
编译报错expected ‘)’ before ‘user_data’的原因是:C语言的类型转换语法是(类型)表达式,而你写的PAppData(_in_)是把类型名当成函数来调用了,编译器无法识别这种语法,所以报错。
正确的宏定义
把宏改成标准的C类型转换格式,同时为了避免表达式优先级问题,给整个转换结果和参数都加上括号:
#define PAPPDATA(_in_) ((PAppData)_in_)
修改后的使用代码
void cb_select_folder (GtkButton* sender, gpointer user_data) { PAppData pad = PAPPDATA(user_data); const gchar* dirname = gtk_entry_get_text (GTK_ENTRY(pad->entry_outdir)); // .. }
这样编译时就能正确识别类型转换,不会再报语法错误了。
内容的提问来源于stack exchange,提问作者Joel
相关产品推荐
相关产品推荐

