内联函数的链接

时间:2011-03-11 11:42:18

标签: c++ inline linkage

我有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):未定义引用`min(int,int)' 当我对包含min()调用的语句进行注释时,它可以工作。 现在,为什么在世界上abs()工作,gcd()正在工作,但min()不是??? 我在 Linux 中使用 g ++

3 个答案:

答案 0 :(得分:4)

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

min也是如此,但除了template之外,标准库中没有此功能。

我的建议:导入<cstdlib><algorithm>,然后使用std::absstd::min

答案 1 :(得分: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);
}

你有一些其他的选择,比如使用全局范围resoultion操作调用abs / min / gcd,比如“:: abs(i)。但是如果你是编程的新手并且只想尝试编写代码我想重命名这些功能是最简单的方法,让你的脚湿透。

答案 2 :(得分:-1)

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