考慮下面的代碼在linux /驅動器/ USB/HID-core.c:編譯器如何以及爲什麼用空函數替換extern函數?
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
然後驅動/ 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()的調用,然後完全使用if語句進行優化。
我無法理解的是編譯器如何將hiddev_hid_event()的調用替換爲空函數。我看到的唯一區別是返回類型extern void
已被替換爲static inline void
。這是否意味着如果沒有定義所有的外部函數將自動變爲空函數?
編號:http://www.linuxjournal.com/article/5780?page=0,3
我會小心這樣的混淆。原始版本至少清楚,如果沒有設置CONFIG變量,則不會調用某些東西。通過隱藏實現,程序員可能會花費一些時間撓撓他們的頭腦,爲什麼編輯器中的函數從來沒有出現過任何事情。 – stsquad