我需要创建一个宏来类型化(正确的词?)来自函数参数的指针 struct .这是我的 struct :

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

要创建宏,我try 这样做:

#define PAPPDATA(_in_) (PAppData(_in_))

我收到错误:"user_data"之前预期的")" 有什么帮助吗?

推荐答案

在C中,您不必将(val *)转换为它的最终类型. 当使用glib时,gpointer是一个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));
  // ..
}

GTK_INTETRY除了强制转换之外,它还进行一些运行时判断GtkWidget*是否实际上是GtkEntry*,当pad->entry_outdir被证明指向Gtkentry以外的其他内容时,您可能会在执行此强制转换时收到运行时警告.但在GObserver中,GtkEntryGtkWidgetGtkWidgetGObject.PAppData是指向 struct 体的纯指针,而不是G对象.

C++相关问答推荐

在C、Linux中同步进程

如何确保内存分配在地址附近?

当包含头文件时,gcc会发出隐式函数声明警告

是否有任何情况(特定类型/值),类型双关在所有符合标准的C实现中产生相同的行为?

malloc实现:判断正确的分配对齐

C中出现分段错误后关闭文件

va_copy的使用是未定义的行为吗?

为什么可以通过指向常量int的指针间接地改变整数的值?

C中是否有语法可以直接初始化一个常量文本常量数组的 struct 成员?

C:二进制搜索和二进制插入

为什么可以在typedef之前使用typedef d struct 体?

是否所有C编译器在将浮点数转换为整型数时都会隐式删除小数?

是否可以使用指针算法在不对齐的情况下在 struct 中相同类型的字段的连续序列之间移动?

在Rust和C之间使用ffi时如何通过 struct 中的[U8;1]成员传递指针

这个C程序在工作中途停止获取输入.我收到分段故障(核心转储).我还是不知道问题出在哪里

将数字的每一位数平方,并使用C将它们连接为一个数字(程序不能正确处理0)

有没有一种方法可以用C创建保留限定符的函数?

赋值两侧的后置增量,字符指针

访问未对齐联合的成员是否为未定义行为,即使被访问的成员已充分对齐?

使用fread()函数读取txt文件