考虑 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
. 这是否意味着所有外部函数如果未定义将自动变为空函数?