我需要创建一个宏来从函数参数类型转换(正确的词?)指针结构。这是我的结构:
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;
我的代码中的某个地方是这样使用的:
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); # typecast macro here
const gchar* dirname = gtk_entry_get_text (GTK_ENTRY(pad->entry_outdir));
// ..
}
要创建宏,我正在尝试这样做:
#define PAPPDATA(_in_) (PAppData(_in_))
我收到错误:在“user_data”之前预期有“)” 有什么帮助吗?
在 C 中,您不必将 (void*) 转换为其最终类型。 当使用 glib 时,gpointer 是 void* 的 typedef。因此,不需要铸造。您确实需要确保类型正确,否则您就会遇到麻烦。
void cb_select_folder (GtkButton* sender, gpointer user_data)
{
PAppData pad = user_data; # No cast Necessary.
const gchar* dirname = gtk_entry_get_text (GTK_ENTRY(pad->entry_outdir));
// ..
}
类型转换是这样发生的:
(PAppData) _in_
现在用括号将它们括起来:
((PAppData) _in_)
现在宏应该可以工作了。您的宏使用了 C++ 转换。
假设
gpointer
是 void *
,则不需要强制转换,因为在 C 中存在与 void *
之间的隐式转换。