2014-02-28 38 views
0

我對C++相對比較陌生,並且通過回答問題進行學習。我試圖使用getopt來管理我的輸入,並且我創建了一些函數來幫助使程序更清晰。下面是我在做什麼(摘錄):在C++函數調用時編譯器錯誤

void processArgs(int,char *,char **,long int *); 

void processArgs(int argc, char ** argv, long int * res) 
{ 
    globalArgs.startTerm = NULL; 
    globalArgs.endTerm = NULL; 
    globalArgs.outFileName = NULL; 
    globalArgs.verbosity = 0; 
    int minimumArgs = 1; 

    //Check for minimum number of parameters 
    if (argc<minimumArgs){ 
    displayUsage(); 
    } 
} 

int main(int argc,char * argv[]){ 
    int * results=NULL; 
    processArgs(argc,argv,results); 
    return 0; 
} 

當我運行下面的編譯,我得到:

g++ -std=c++0x fibonacci.cpp -o fibonacci 
fibonacci.cpp: In function âint main(int, char**)â: 
fibonacci.cpp:68: error: no matching function for call to âprocessArgs(int&, char**&, int*&)â 
fibonacci.h:3: note: candidates are: void processArgs(int, char*, char**, long int*) 
fibonacci.cpp:46: note:     void processArgs(int, char**, long int*) 

能有人幫我理解這個問題?我相信它與我對argv相關指針如何工作的理解有關。

感謝 丹

+0

你的描述不是很好:它不是失敗的函數調用,但你有一個編譯器錯誤。 – Wolf

回答

3

你的函數簽名不匹配

void processArgs(int,char *,char **,long int *);

void processArgs(int argc, char ** argv, long int * res)

支票char *

你可以從void processArgs(int,char *,char **,long int *);刪除char *,或者你可以重新移動整條線。

這裏因爲你已經定義了上面的功能main()所以在函數之前不需要使用void processArgs(int,char *,char **,long int *);,因爲在編譯main()之前編譯器已經獲得了函數簽名。

+0

在這種情況下,我會添加關於重新格式化和/或省略聲明的建議。 – Wolf

+0

輝煌。我沒有看到,謝謝。您。我總是被告知在頭文件中添加一個聲明,然後在主文件中定義函數。那麼情況並非如此? – Dan

+0

主要的概念是你需要在函數調用之前提供函數簽名,如果你將簽名放在頭文件中,那麼函數簽名可以提供給多個文件,只需要包含該頭文件就可以調用該函數。 – rajenpandit

1

首先,由於rajenpandit已經表示,您的聲明和定義簽名是不同的。 其次,我想它由於最後一個參數而無法調用該函數:函數期望long int *,而您提供它爲int *

+0

編譯器先看第二件事。 :) – Wolf

1

第一個明顯的問題(程序員!)在你的代碼 - rajenpandit已經說明了 - 是signature不匹配 - 但是 - 作爲Vlad from Moscow發現 - 在編譯並沒有就此停止。 調用本身並不符合您給出的兩個聲明中的任何一個。這是編譯器說的。


順便說一句: 用C聲明函數的最簡單方式/ C++:使用剪貼板(手動添加的分號):

void processArgs(int argc, char ** argv, long int * res); 

void processArgs(int argc, char ** argv, long int * res) 
{ 
    // your function body 
} 

複製&糊方法還具有另一個優點:函數聲明然後還包含參數名稱,如果有多個參數,該函數特別有用。當您鍵入呼叫時,許多IDE也會將這些名稱顯示爲提示。

2

考慮到這兩個函數聲明聲明不同的功能,因爲他們有不同數量的參數

void processArgs(int,char *,char **,long int *); 

void processArgs(int argc, char ** argv, long int * res); 

但是它不是錯誤的原因。

編譯器的錯誤信息令人困惑。的問題是,在第二函數聲明(即在相同的時間是一個定義)第三個參數被聲明爲具有類型

long int * 

然而調用函數傳遞給它作爲一個參數的對象(變量結果)類型的

int * 

這是你的定義傳遞給函數的對象和函數調用

int * results=NULL; 
    processArgs(argc,argv,results); 

有來自012的隱式轉換到long int *

所以編譯器發出錯誤。

+0

+1如果您重新排列參數,您的答案可能會更好。仔細研究編譯器錯誤,是一個好主意 - 大多數讀者明顯停止了第一個明顯的錯誤。順便說一句:你的答案中存在一個問題。 – Wolf

+0

@狼有什麼問題? –

+0

讓我們[在聊天中繼續討論](http://chat.stackoverflow.com/rooms/48679/discussion-between-wolf-and-vlad-from-moscow) – Wolf