2017-02-16 87 views
1

我有一個由輪詢(每10毫秒)調用的函數,它有它的開始檢查:如何複製功能優化

if(input != saved_data) 
    return; 
// rest of the function... 

,雖然這個檢查可以節省大量的時間,有時這是錯誤的,我目前正在調試的情況下,我需要繼續執行功能,雖然input == saved_data

我想到了2個選項:

  1. 添加一個「力」標誌的參數列表,雖然這是真的,則如果將被忽視
  2. 創建一個新的功能old_function_force代碼相同,除如果

我選擇了選項2,因爲我不想讓其他所有的呼召修改的功能,我想代碼是向後兼容的,但它發生,我認爲我的解決方案也很糟糕,因爲有人應該改變old_function他可能會忘記更換我的,這會導致新的錯誤

除了這兩個方法之外還有更好的解決方案,還是改進其中之一的方法?

回答

5

兩者的混合實際上是你如何避免代碼重複和不斷變化的各種可能的調用點:

  1. 重命名功能,並添加了flag參數。

    void func_with_force(/*parameters*/, bool force) 
    { 
        if(!force && input != saved_data) 
        return; 
    
        // Other code 
    } 
    
  2. 添加新的功能,下名,調用一個以上的標誌等於false

    void func(/*parameters*/) 
    { 
        func_with_force(/*Argument forwarding*/, false); 
    } 
    

是的,我認爲stdbool.h


您還可以進一步將func完全放在標題中;只需添加聯說明:

inline void func(/*parameters*/) 
{ 
    func_with_force(/*Argument forwarding*/, false); 
} 

引述C11標準(6.7.4p7):

對於外部鏈接的功能,受到以下限制:如果一個函數與內聯聲明函數說明符,那麼它也應該在同一個翻譯單元中定義。如果翻譯單元中的某個函數的所有文件範圍聲明都包含不帶extern的內聯函數說明符,則該翻譯單元中的定義是內聯定義。內聯定義不爲該功能提供外部定義,並且不禁止其他翻譯單元中的外部定義。

以上意味着即使許多翻譯單元包含標題,內聯定義也不會相互干擾。而且很短,很可能這個存根將被優化成直接調用你的新函數。

+0

我認爲,當我想要一個強制執行。我會調用func_with_force(/ *參數* /,true),是嗎? – CIsForCookies

+1

@noob - 準確地說。我主要關注如何以儘可能低的成本添加新功能。當然,如果你想使用新功能,你需要調用新命名的函數。 – StoryTeller