неопределенная ссылка на PrintArgv: почему?

Когда я компилирую свою программу, я получаю три ошибки "undefined reference to '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.


person DFord    schedule 07.04.2012    source источник
comment
Можете ли вы построить гораздо более короткий тестовый пример?   -  person Oliver Charlesworth    schedule 07.04.2012


Ответы (2)


Ваш прототип имеет параметр типа ofstream &, а ваш заголовок имеет тип ostream &. Это означает, что реализация PrintArgv фактически объявляет новую функцию. Однако вы вызываете ту, для которой указали прототип, у которой нет тела, потому что вы непреднамеренно создали новую функцию вместо определения тела исходной.

person chris    schedule 07.04.2012
comment
Вау, спасибо. Я проверил прототип и вызов, но не проверил саму функцию. - person DFord; 07.04.2012
comment
Просто помните, что ошибка, которую вы получаете, возникает, когда функция объявлена, но не имеет исполняемого тела, которое может найти компоновщик. Это определенно поможет отладке будущего кода. - person chris; 07.04.2012

Замените определение функции вверху фактически используемыми аргументами:

#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)
person Haatschii    schedule 07.04.2012
comment
На первый взгляд это выглядит так, как будто он предлагает добавить именованные параметры, а не только типы. Но похоже, что он уловил разницу ofstream/ostream в прототипе PrintArgv(). +1 - person Amardeep AC9MF; 07.04.2012