2011-06-29 52 views
1

我不明白我的錯誤是:C的誤差:函數原型聲明不在範圍內

void main(char string[]) 
{ 
    strcpy(command_E,string); 
    processCMD(); /*FIRST ERROR: prototype function declaration not in scope */ 
} 

void processCMD(void) /*SECOND ERROR: external item attribute mismatch */ 
{ 
    .... /*rest of code not displayed*/ 

回答

4

,在您使用processCMD()點,你還沒有宣佈它的原型,所以它得到了一個默認。

事實上,你沒有聲明它會導致第一個錯誤。

事實上,您的實際定義與創建的默認定義相沖突,因爲您尚未聲明它是導致第二個錯誤的原因。

的解決方案是使用前向任一定義函數:

void processCMD(void) { 
    blah blah blah 
} 

void main (char string[]) { // not really a good definition for main, by the way. 
    strcpy(command_E,string); 
    processCMD(); 
} 

或在使用之前提供了一個原型:

void processCMD(void); 

void main (char string[]) { // not really a good definition for main, by the way. 
    strcpy(command_E,string); 
    processCMD(); 
} 

void processCMD(void) { 
    blah blah blah 
} 

至於main聲明,這兩個正則形式是:

int main (void); 
int main (int argc, char *argv[]); // or char **argv. 

其他標準允許使用標準(已定義實現),但這兩者是必需的(至少對於託管實現 - 獨立實現,如嵌入式系統或操作系統可以很好地執行任何他們想要的操作)。

+0

如果main(char string [])不是main的好定義,另一種選擇是什麼?!? – Ken

+0

@Ken,看到更新。 – paxdiablo

1

你需要一個原型之前,先使用該函數的聲明它使編譯器知道什麼樣的參數的函數需要(如果有的話)和它返回什麼:

void processCMD(void); // prototype 

void main(char string[]) 
{ 
    strcpy(command_E,string); 
    processCMD(); 
} 

void processCMD(void) 
{ 
    .... /*rest of code not displayes*/ 

或者,你可以定義它的第一次使用(自定義將提供編譯器想要的信息之前,該函數

通常,原型將放在頭文件中,以便其他模塊可以使用該函數,因爲函數定義只能位於一個源文件中(禁止將函數設置爲靜態,這使得函數的每個實例都爲「私有」一個模塊,或將該功能標記爲內聯,從而啓用多個定義)。

一些額外的原型瑣事:

  • 一般在C,缺乏protoype的本身不是一個錯誤 - 如果編譯器看到一個函數調用沒有見過原型它會假設你」重新傳遞正確的參數,它會將「默認促銷」應用於參數(基本上根據情況將其轉換爲intdouble),並假定函數返回int。如果這些假設是錯誤的,那麼程序是不正確的,並且會有未定義的行爲。編譯器通常可以配置爲發出警告或錯誤,以調用沒有原型的函數(顯然是你的)。在C++中,調用沒有看到前一個原型的函數(或完整的函數定義)始終是一個錯誤。

  • 在C語言中,有之間的差異:

    void processCMD(); 
    

    void processCMD(void); 
    

    首先是一個函數聲明,但沒有一個原型 - 它告訴編譯器processCMD是一個函數,它返回void而不是int。但它沒有告訴編譯器關於參數的任何信息。編譯器仍然允許使用傳遞的參數進行函數調用,並將應用默認促銷。 (同樣,這個特性可能會被編譯器配置禁用)。

    第二個原型專門告訴編譯器該函數不帶任何參數。

    在C++中,兩者都是等價的,並明確告訴編譯器該函數不帶任何參數。