2012-04-07 5 views
0

私のプログラムをコンパイルすると、3つの "PrintArgv(...)"エラーへの未定義参照があります。私は検索しましたが、私はこれらのエラーが出ている理由を見つけることができません。私はエラーを取得していますどこ"PrintArgvへの未定義参照":なぜですか?

#include "tools.hpp" 

enum ARG_T {COMMAND, SWITCH, ARGUMENT}; 
void ReadArgs(int, char**, ofstream&); 
void PrintArgv(char*, ARG_T, ofstream&); 


int main(int argc, char* argv[]) 
{ 
    ofstream fout; 
    try{ 
     fout.open("P1Ford.txt", ios::out | ios::app); 
    } 
    catch(...) 
    { 
     //fatal("Could not open file P1Ford.txt"); 
     cout << "Could not open file P1Ford.txt" << "\n"; 
     return -1; 
    } 

    ReadArgs(argc, argv, fout); 

    fout.close(); 
    return 0; 
} 

/*----------------------------------------------------------------------------- 
This function takes the values passed in through the command line 
then examines each one to determine if it is the command, a switch or 
an argument. Then passes it to a function to print it to the file. 
-----------------------------------------------------------------------------*/ 
void ReadArgs(int argc, char* argv[], ofstream& fout) 
{ 
    for(int c=0; c<argc; ++c) 
    { 
     if(c == 0) PrintArgv(argv[c], COMMAND, fout); 
     else if(strncmp(argv[c], "-", 1) == 0) PrintArgv(argv[c], SWITCH, fout); 
     else if(strncmp(argv[c], ">", 1) == 0) ; 
     else PrintArgv(argv[c], ARGUMENT, fout); 
    } 
} 

/*----------------------------------------------------------------------------- 
This function prints the argument in the correct format 
Command <command> 
    Switch <switch> 
    Argument <agrument> 
    Argument <argument> 
-----------------------------------------------------------------------------*/ 
void PrintArgv(char* val, ARG_T type, ostream& fout) 
{ 
    if(type == COMMAND) fout << "Command " << val << "\n"; 
    if(type == SWITCH) fout << "\t" << "Switch " << val << "\n"; 
    if(type == ARGUMENT) fout << "\t" << "Argument " << val << "\n"; 
} 

機能ReadArgsがある:ここに私のコードです。 PrintArgvを呼び出すたびにエラーが表示されます。私はG ++ 4.6.1を使用しています。

+0

をあなたははるかに短いテスト・ケースを構築することができますか? –

答えて

5

プロトタイプのパラメータはofstream &で、ヘッダのタイプはostream &です。これは、PrintArgvの実装が実際に新しい関数を宣言していることを意味します。オリジナルの本体を定義するのではなく、意図せずに新しい関数を作成したため、本体がないプロトタイプを指定したものを呼び出します。

+0

うわー、ありがとう。プロトタイプと呼び出しをチェックしましたが、関数自体を二重チェックしませんでした。 – DFord

+0

関数が宣言されているが、リンカーが見つけることができる実行可能な本体がないときにエラーが発生していることを覚えておいてください。これは間違いなく将来のコードのデバッグに役立ちます。 – chris

+0

ありがとう、私はそれを念頭に置いておきます。 – DFord

1

が使用実際には引数でトップにあなたの関数の定義を置き換えます

#include "tools.hpp" 

enum ARG_T {COMMAND, SWITCH, ARGUMENT}; 

void ReadArgs(int argc, char* argv[], ofstream& fout) 
void PrintArgv(char* val, ARG_T type, ostream& fout) 
+0

表面には、型の代わりに名前付きのパラメータを追加するように思われます。しかし、PrintArgv()プロトタイプのofstream/ostreamの違いをキャッチしたようです。 +1 –

関連する問題