2012-05-23 53 views
0

考慮下面的代碼在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

+0

我會小心這樣的混淆。原始版本至少清楚,如果沒有設置CONFIG變量,則不會調用某些東西。通過隱藏實現,程序員可能會花費一些時間撓撓他們的頭腦,爲什麼編輯器中的函數從來沒有出現過任何事情。 – stsquad

回答

3

功能實際上是定義,但有一個空體:

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

優化掉空機構內聯函數是微不足道的,我猜。

+0

對,我忽略了空的功能體。這意味着沒有自動轉換爲null,我們必須手動提供一個空函數體。 –

相關問題