Связь встроенных функций - PullRequest
2 голосов
/ 11 марта 2011

У меня есть 2 файла:

1 - это main.cpp

#include<iostream>
using namespace std;

int min(int,int);
int abs(int);
int gcd(int,int);

const char *s = "Read Error!!";

int main()
{
  cout << "Enter first Value: ";
  int i;
  cin >> i;
  while(!cin)
  {
    cout << s << endl;
    cin >> i;
  }

  cout << "Enter second Value: ";
  int j;
  cin >> j;
  while(!cin)
  {
    cout << s << endl;
    cin >> j;
  }

  cout << "\nmin: " << min(i,j) << endl;
  i = abs(i);
  j = abs(j);
  cout << "gcd: " << gcd(i,j) << endl;
  return 0;
}

## 2 - это gcd.cpp
inline int abs(int iobj)
{
  return iobj < 0 ? -iobj : iobj;
}


inline int min(int p1,int p2)
{
  return p1 < p2 ? p1 : p2;
}


int gcd(int v1, int v2)
{
  while(v2)
  {
    int temp = v2;
    v2 = v1 % v2;
    v1 = temp;
  }
  return v1;
}

Теперь проблема в том, что когда я компилирую 2 файла, проблем по очевидным причинам не возникает, однако я получаю сообщение об ошибке во время компоновки: main.cpp :(. text + 0x100): неопределенная ссылка на `min (int, int) ' Когда я комментирую строку, утверждение, содержащее вызов min (), работает. Теперь, почему в мире работает abs (), работает gcd (), а min () нет ??? Я использую g ++ в Linux .

Ответы [ 3 ]

4 голосов
/ 11 марта 2011

abs «работает», потому что он находится в стандартной библиотеке C как обычная функция. Ваш домашний напиток abs никогда не экспортируется из его модуля, потому что он inline.

То же самое происходит с min, но это не доступно в стандартной библиотеке, кроме как template.

Мой совет: импортируйте <cstdlib> и <algorithm> и используйте вместо них std::abs и std::min.

1 голос
/ 11 марта 2011

Если вы просто пытаетесь учиться и хотите, чтобы ваш собственный код вызывал abs, min и gcd, вы можете переименовать их в что-то вроде «my_abs», «my_min» и «my_gcd» в обоих файлах, а затем удалить встроенный код. Ключевое слово из объявлений.

Например:

// gcd.cpp

// renamed abs to my_abs to avoid name collision with std library function.
int my_abs(int iobj)
{
    return (iobj<0?-iobj:iobj);
}

У вас есть несколько других опций, например, вызов abs / min / gcd с использованием операции восстановления глобальной области видимости, такой как ":: abs (i). Но если вы новичок в программировании и просто пытаетесь почувствовать написание кода, я думаю, что переименование функции - самый простой способ промокнуть ноги.

0 голосов
/ 11 марта 2011

Abs, вероятно, работает, потому что в стандарте есть функция "abs". Вы должны добавить заголовки и прототип для вашего кода для работы: в настоящее время ваш файл 1 игнорирует все, что существует в вашем файле 2.

...