2

我有 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;
}

现在的问题是当 1 编译 2 个文件时,由于明显的原因没有问题,但是我在链接时遇到错误:main.cpp:(.text+0x100): undefined reference to `min(int, int )' 当我评论包含 min() 调用的语句时,它起作用了。现在,为什么在世界上 abs() 有效, gcd() 有效但 min() 无效???我在Linux中使用g++

4

3 回答 3

4

abs“有效”,因为它在标准 C 库中作为常规函数存在。您的自制软件abs永远不会从其模块中导出,因为它是inline.

同样的情况也发生mintemplate.

我的建议:导入<cstdlib>and <algorithm>,然后改用std::absand std::min

于 2011-03-11T11:46:53.773 回答
1

如果您只是想学习并希望看到自己的代码调用 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(i)”)调用 abs/min/gcd。但是,如果您是编程新手并且只是想尝试编写代码,我认为重命名函数是弄湿脚的最简单方法。

于 2011-03-11T12:06:54.253 回答
-1

Abs 可能正在工作,因为 std 中有一个“abs”函数。您应该添加标题和原型以使您的代码正常工作:目前,您的文件 1 忽略了文件 2 中存在的所有内容。

于 2011-03-11T11:48:34.410 回答