繁体   English   中英

内联函数的链接

[英]Linkage of inline functions

我有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 ++

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

min也会发生同样的情况,但是除了作为template之外,在标准库中不可用。

我的建议:导入<cstdlib><algorithm> ,并使用std::absstd::min代替。

如果您只是想学习并希望看到自己的代码,用于abs,min和gcd,则可以在两个文件中将它们重命名为“ my_abs”,“ my_min”和“ my_gcd”,然后从中删除inline关键字。声明。

例如:

// 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。但是,如果您是编程新手,只是想尝试编写代码,我认为重命名功能是最简单的方法来弄湿你的脚。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM