2010-10-27 66 views

回答

16

存根例程可以是(至少)兩件事之一。


首先,它可以是一個佔位符例程您快速開發測試一個高級程序,與後來在一個替代真實版的意圖。這通常使用自上而下的開發(第一編碼的更高水平的再下來自己的方式工作,以更詳細的東西),可以很簡單的:

int getCount (void) { return 7; } // just return fixed value for testing. 

或稍微複雜一點:

// Cycle through values for some variety. 
int getCount (void) { 
    int retvals[] = {2,7,1,8,2,8,1,8,2,8,4,5,9}; 
    static int pos = -1; 
    pos = (pos + 1) % (sizeof (retvals)/sizeof (*retvals)); 
    return retvals[pos]; 
} 

當然,一旦存根變得足夠複雜,你可能也只是實現真實的東西:-)


其次,它是常用的遠程過程調用(RPC)environm使用經濟需求。存根用於編組數據並將其傳送到另一端的服務器。

RPC需要爲客戶端和服務器創建存根函數。這是非常相似的函數原型在C,但最終的結果略有不同,如:

+----------------+ 
| Client   | 
| +----------+ | +---------------+ 
| | main | | | Server  | 
| |----------| | | +----------+ | 
| | stub_cli |------->| stub_svr | | 
| +----------+ | | |----------| | 
+----------------+ | | function | | 
        | +----------+ | 
        +---------------+ 

在這個例子中,而不是在同一個程序調用functionmain調用客戶存根功能(具有相同原型爲function),負責打包信息並通過網絡將其傳輸到另一個進程。這可以是同一臺機器或不同的機器,這並不重要 - RPC的優點之一是可以隨意移動服務器。

在服務器中,有一個「偵聽器」進程將接收該信息並將其傳遞給服務器。服務器的存根接收信息,將其解包並將其傳遞給實際功能。

真正的函數然後做它需要的東西並返回到服務器存根,它可以打包返回信息並將其傳回客戶端存根。

然後客戶端存根解包並將其傳遞迴main

+0

真棒的答案,謝謝一堆:) – 2010-10-27 03:36:20

7

它是一個與真實函數具有相同簽名的函數,但它什麼都不做,並且可以像真實的東西一樣編譯和執行。例如

int MyStub(char * str) 
{ 
    /* Stub - Does Nothing */ 

    return 0; 
} 

這些通常用作佔位符,因此可以首先計算總體程序結構,然後再詳細說明。

0

在C語言中,Stub代碼實際上調用main(),而不是OS或Compiler。

+0

你的意思是'啓動'代碼?我還沒有聽說過在這種情況下使用的存根代碼。 – paxdiablo 2015-03-22 21:55:16