如何通过ID而不是字符串名发送g_signal_connect()?

如何通过ID而不是字符串名发送g_signal_connect()?,c,gtk,micro-optimization,C,Gtk,Micro Optimization,GTK中处理按钮按下的典型方式为: g_signal_connect(GTK_BUTTON(myButton), "pressed", G_CALLBACK(myButtonHandler), NULL); 但是,我发现使用字符串(如“pressed”)进行内部标识很糟糕、很慢,而且没有必要。如果我能找到与此对应的数字信号ID,我可以跳过解析步骤。但是如何通过ID而不是字符串名称连接事件?我做了大量的挖掘和发现,我还了解到g\u signal\u connect是一个扩展到

GTK中处理按钮按下的典型方式为:

g_signal_connect(GTK_BUTTON(myButton), "pressed", G_CALLBACK(myButtonHandler), NULL);
但是,我发现使用字符串(如
“pressed”
)进行内部标识很糟糕、很慢,而且没有必要。如果我能找到与此对应的数字信号ID,我可以跳过解析步骤。但是如何通过ID而不是字符串名称连接事件?我做了大量的挖掘和发现,我还了解到
g\u signal\u connect
是一个扩展到
g\u signal\u connect\u data
的宏,但这些都不能完全解决我的问题

这可能吗?如果可能,我该怎么做?

您可以使用,但必须创建一个
GClosure
结构来保存回调和回调数据

我真的会建议不要这样做,因为它会为您的代码添加样板,这样就没有什么好处了。通常只连接一次信号。如果您在一个紧密的循环中连接一个信号,那么您可能是做错了什么,或者您有一个非常不寻常的用例。不管怎么说,信号名实际上是被拘留的,这意味着您甚至不需要承担字符串比较的费用;如果信号具有详细注释,则仅在
处拆分字符串的成本。不要费心优化它,除非它实际上在探查器图形上显示为瓶颈。

您可以使用它,但是您必须创建一个
GClosure
结构来保存回调和回调数据


我真的不建议这样做,因为它会在代码中添加样板文件,几乎没有什么好处。通常只连接一次信号。如果您在一个紧密的循环中连接一个信号,那么您可能是做错了什么,或者您有一个非常不寻常的用例。不管怎么说,信号名实际上是被拘留的,这意味着您甚至不需要承担字符串比较的费用;如果信号具有详细注释,则仅在
处拆分字符串的成本。不要费心优化它,除非它实际上在您的分析器图表上显示为一个瓶颈。

您的问题到底是什么?解析短字符串(很可能在启动时只解析一次)不应该是一个明显的问题。使用字符串而不是ID可以使系统对生成和执行过程中使用的不同版本的库具有鲁棒性。@Gerhardh但是,为什么要使用字符串而不是宏?使用字符串进行标识很麻烦,我刚才提到了原因。如果在列表中插入另一个字符串,则字符串不会失败。尝试将一些枚举用作ID。@Gerhardh宏不会失败,尽管编译器不知道宏。它们被扩展为字符串或ID。这没什么区别。你到底有什么问题?解析短字符串(很可能在启动时只解析一次)不应该是一个明显的问题。使用字符串而不是ID可以使系统对生成和执行过程中使用的不同版本的库具有鲁棒性。@Gerhardh但是,为什么要使用字符串而不是宏?使用字符串进行标识很麻烦,我刚才提到了原因。如果在列表中插入另一个字符串,则字符串不会失败。尝试将一些枚举用作ID。@Gerhardh宏不会失败,尽管编译器不知道宏。它们被扩展为字符串或ID。这里没有区别。