Вызов функции из внешнего файла C ++ - PullRequest
0 голосов
/ 02 июня 2018

Я пытаюсь вызвать функцию из внешнего файла в исходный файл.Однако при этом я получаю следующую ошибку:

Ошибка сборки Visual Studio C ++

Почему я получаю следующие ошибки?Я пытался обдумать это весь день, но все было напрасно.PS Я очень плохо знаком с языком и программированием в целом.Прошлый опыт: Python

source.cpp

#include <iostream>
#include <string>
#include "func.cpp"
using namespace std;

double pow(double x, int y);

int main()
{
    double x;
    int y;
    double answer;

    cout << "Choose a number: " << endl;
    cin >> x;
    cout << "Raised to the power: " << endl;
    cin >> y;

    answer = pow(x, y);

    cout << "Answer: " << answer << endl;

    return answer;
}

func.cpp

double pow(double x, int y)
{
    double result = 1;
    if (x == 0 && y == 0)
    {
        result = -1;
    }
    else
    {
        if (y == 0)
        {
            result = 1;
        }
        else if (y < 0)
        {
            x = 1.0 / x;
            y *= -1;
        }
        for (int i = 0; i < y; i++)
        {
            result *= x;
        }

    }

    return result;
}

Ответы [ 2 ]

0 голосов
/ 02 июня 2018

Здесь происходит пара вещей.Самый ближайший из них, который вы включили, объявляет pow или std::pow.Как бы мне ни хотелось обвинять все это в using namespace std;, хорошая старая функция C pow достаточно хороша, чтобы сорвать компилятор.Компилятор находит два pow с достаточно похожими параметрами и не знает, какой из них использовать.Вместо этого назовите вашу функцию mypow или поместите ее в собственное пространство имен.

Например: func.cpp

namespace my
{ 
    double pow(double x, int y)
    {
        // guts of pow are unchanged
    }
}

и в source.cpp

double pow(double x, int y);

становится

namespace my
{ 
    double pow(double x, int y);
}

и называется

answer = my::pow(x, y);

Это решает проблему 1.

Проблема 2 - это проблема компоновщика, которую вы еще не видели.В вашем проекте func.cpp будет скомпилирован в func.obj.func.cpp также включен в source.cpp.Включенная функция эффективно вставляется во включаемый файл, так что теперь у вас есть две копии всего в func, который компилируется.pow можно найти внутри func.obj и source.obj.

Это становится проблемой, когда компоновщик пытается собрать func.obj и source.obj в один исполняемый файл.компоновщик находит два pow s и, как и компилятор, не знает, какой из них использовать.

Стандартное правило - не включать файлы cpp.Пусть компилятор скомпилирует их, а компоновщик скомпонует их.Создайте заголовок, который отображает функции в файле cpp, которые необходимо использовать извне, и пусть пользователи включают заголовок.

Это делает вашу программу похожей на

func.h

#pragma once
namespace my
{
    double pow(double x, int y);
}

func.cpp

namespace my
{ 
    double pow(double x, int y)
    {
        double result = 1;
        if (x == 0 && y == 0)
        {
            result = -1;
        }
        else
        {
            if (y == 0)
            {
                result = 1;
            }
            else if (y < 0)
            {
                x = 1.0 / x;
                y *= -1;
            }
            for (int i = 0; i < y; i++)
            {
                result *= x;
            }

        }

        return result;
    }
}

source.cpp

#include <iostream>
#include <string>
#include "func.h"
using namespace std;

int main()
{
    double x;
    int y;
    double answer;

    cout << "Choose a number: " << endl;
    cin >> x;
    cout << "Raised to the power: " << endl;
    cin >> y;

    answer = my::pow(x, y);

    cout << "Answer: " << answer << endl;

    return answer;
}

Не имеет отношения, но хорошо читается: Почему "использование пространства имен std" считается плохой практикой?

0 голосов
/ 02 июня 2018

Вот все, что вам нужно сделать, чтобы решить эту проблему:

Шаг 1-

изменить второй файл c ++ на заголовочный файл c ++, изменив расширение на '.hpp'и в другом файле.

Шаг 2-

удалить строку 6 из source.cpp

Вышеприведенное должно исправить вашу проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...