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 関数になることを意味しますか?