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です。これは、定義されていない場合、すべての extern 関数が自動的に null 関数になることを意味しますか?

参照: 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 に答える