cpp测试源文件与库文件存在相同的函数

⌚Time: 2022-04-25 21:30:55

👨‍💻Author: Jack Ge

最近想到,如果c++的源文件与库文件包含相同函数,并且在编译时同时编译源文件,链接到库文件。会发生什么情况

我的预测是会在链接阶段出现问题。如果两个文件包含相同符号定义,就相当于在两个源文件中重复定义

今天验证了一下,用静态库libaaa.lib。此静态库只包含一个函数


int max_number(int,int);

在调用此函数时,会返回参数中两个数中最大的那个。

建立一个测试项目,将静态库加入项目

在项目中增加一个源文件a.cpp,在其中实现此函数,此函数与库文件中的函数参数,名字,返回值都一样,唯一不同的是,在调用的时候会输出"cpp processing",作为区分

a.cpp


//cpp文件中定义的函数

int max_number(int number1,int number2){

    cout<<"cpp processing"<<endl;

    return number1>number2?number1:number2;

}

main函数所在的源文件中,对max_number函数进行声明,并且进行调用

0425.cpp


#include<iostream>

using namespace std;

//声明函数

int max_number(int,int);



int _tmain(int argc, _TCHAR* argv[])

{

    cout<<max_number(3,4)<<endl;

    system("pause");

    return 0;

}


结果是:

看样子,在源文件和库文件同时存在相同函数的情况下,会优先使用源文件的函数,并不会产生编译链接错误

将a.cpp中的函数注释掉


//cpp文件中定义的函数

//int max_number(int number1,int number2){

//  cout<<"cpp processing"<<endl;

//  return number1>number2?number1:number2;

//}

这回调用的是库文件的函数了。

到了这里,结果好像已经出来了,当源文件与库文件中同时存在相同函数时,编译链接并不会报错,MSVC编译器会优先选择源文件中的函数,源文件中没有找到,才会从库文件中找。

没有像多个源文件重复定义符号那样报错。

但是我又尝试了下面的几种情况

将a.cpp删除,直接将函数实现在main函数所在的源文件中。


#include<iostream>

using namespace std;

//声明函数

int max_number(int,int);



//cpp文件中定义的函数

int max_number(int number1,int number2){

    cout<<"cpp processing"<<endl;

    return number1>number2?number1:number2;

}

int _tmain(int argc, _TCHAR* argv[])

{

    cout<<max_number(3,4)<<endl;

    system("pause");

    return 0;

}

结果:调用cpp文件中定义的函数

注释cpp中的函数


#include<iostream>

using namespace std;

//声明函数

int max_number(int,int);



//cpp文件中定义的函数

//int max_number(int number1,int number2){

//  cout<<"cpp processing"<<endl;

//  return number1>number2?number1:number2;

//}

int _tmain(int argc, _TCHAR* argv[])

{

    cout<<max_number(3,4)<<endl;

    system("pause");

    return 0;

}

结果:调用库中函数

将cpp中函数写在main函数后面


#include "stdafx.h"

#include<iostream>

using namespace std;

//声明函数

int max_number(int,int);



int _tmain(int argc, _TCHAR* argv[])

{

    cout<<max_number(3,4)<<endl;

    system("pause");

    return 0;

}

//cpp文件中定义的函数

int max_number(int number1,int number2){

    cout<<"cpp processing"<<endl;

    return number1>number2?number1:number2;

}

发生链接错误,出现重复定义的错误,这就是之前猜想的错误了!