0

考虑 linux/drivers/usb/hid-core.c 中的以下代码:

static void hid_process_event (struct hid_device *hid,
                               struct hid_field *field,
                               struct hid_usage *usage,
                               __s32 value)
{
   hid_dump_input(usage, value);
   if (hid->claimed & HID_CLAIMED_INPUT)
         hidinput_hid_event(hid, field, usage, value);
#ifdef CONFIG_USB_HIDDEV
   if (hid->claimed & HID_CLAIMED_HIDDEV)
         hiddev_hid_event(hid, usage->hid, value);
#endif
}

如果未启用特定配置选项,作者不想在这里调用 hiddev_hid_event()。这是因为如果未启用配置选项,该功能甚至不会出现。

要删除此#ifdef,对 include/linux/hiddev.h 进行了以下更改:

#ifdef CONFIG_USB_HIDDEV
   extern void hiddev_hid_event (struct hid_device *,
                                 unsigned int usage,
                                 int value);
#else
   static inline void
   hiddev_hid_event (struct hid_device
*hid,
                     unsigned int usage,
                     int value) { }
#endif

然后drivers/usb/hid-core.c改为:

static void hid_process_event
                           (struct hid_device *hid,
                            struct hid_field *field,
                            struct hid_usage *usage,
                            __s32 value)
{
   hid_dump_input(usage, value);
   if (hid->claimed & HID_CLAIMED_INPUT)
         hidinput_hid_event(hid, field, usage, value);
   if (hid->claimed & HID_CLAIMED_HIDDEV)
         hiddev_hid_event(hid, usage->hid, value);
}

如果未启用 CONFIG_USB_HIDDEV,编译器会将 hiddev_hid_event() 调用替换为 null 函数调用,然后完全优化 if 语句。

我无法理解的是编译器如何将 hiddev_hid_event() 调用替换为 null 函数。我看到的唯一区别是返回类型extern void已替换为static inline void. 这是否意味着所有外部函数如果未定义将自动变为空函数?

参考:http ://www.linuxjournal.com/article/5780?page=0,3

4

1 回答 1

3

该函数实际上定义,但有一个空主体:

static inline void
hiddev_hid_event (struct hid_device *hid,
                 unsigned int usage,
                 int value) 
{ }

我想用空体优化内联函数是微不足道的。

于 2012-05-23T12:52:57.390 回答