为指针结构创建一个宏

问题描述 投票:0回答:2

我需要创建一个宏来从函数参数类型转换(正确的词?)指针结构。这是我的结构:

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 casting c-preprocessor
2个回答
0
投票

在 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));
  // ..
}

0
投票

类型转换是这样发生的:

(PAppData) _in_

现在用括号将它们括起来:

((PAppData) _in_)

现在宏应该可以工作了。您的宏使用了 C++ 转换。

假设

gpointer
void *
,则不需要强制转换,因为在 C 中存在与
void *
之间的隐式转换。

© www.soinside.com 2019 - 2024. All rights reserved.