2011-03-11 104 views
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; 
} 

现在的问题是当编译2个文件时,出于显而易见的原因没有问题,但是在链接时出现错误: main.cpp :(。text + 0x100):未定义引用'min(int,int)' 当我注释行包含调用min()它的声明它的作品。 现在,为什么在世界abs()正在工作,gcd()正在工作,但min()不是? 我正在使用g ++ in Linux

+1

从'abs'和'min'中删除'inline'限定符gcd.cpp – 2011-03-11 11:46:23

+2

您是否听说过缩进? – 2011-03-11 11:49:19

+0

您能否让您的问题标题更具描述性?此标签中的几乎所有问题都是“关于CPP项目样本”。 – 2011-03-11 11:50:29

回答

4

abs“works”,因为它在标准C库中作为常规函数。你的自制软件abs永远不会从模块中输出,因为它是inline

min也是如此,但是在标准库中不可用,除非是template

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

+2

简而言之,这是否意味着 - 内联函数具有静态链接? – Sadique 2011-03-11 12:06:30

+0

@Acme:是的。 http://www.parashift.com/c++-faq-lite/inline-functions.html#faq-9.6(“inline”关键字的意图是用** no **链接来制作函数,即让它们具有它们由编译器而不是链接器进行内联扩展。) – 2011-03-11 12:08:17

-1

Abs可能工作,因为标准中有一个“abs”功能。您应该为您的代码添加标题和原型:目前,您的文件1忽略文件中存在的所有内容2.

+0

这些函数在'main.cpp'中用完全原型声明。 'gcd'被正确导出。 – 2011-03-11 11:53:01

1

如果您只是想学习并希望看到自己的代码需要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(我)在全球范围内resoultion操作调用ABS /分钟/ GCD但是,如果你是新的编程和公正。试图获得编写代码的感觉我认为重命名函数是最简单的方法让你的脚湿润