函数重载原理:编译器把重载的函数根据参数修饰成不同的函数名以便于区分,
main.cpp//c++程序调用c语言程序
结果如下:
编译结果如下:链接出错
比如void func(); 编译器可能会将函数名修饰成_func,当编译器碰到void func(int x),编译器可能将函数名修饰为func_int,不同的编译器修饰的成不同的函数名,每个编译器都不一样
因为c++需要支持重载函数,所以c和c++编译同一个函数会产生不同的函数名
在linux下测试结果:
c函数: void MyFunc(){} ,被编译成函数: MyFunc
c++函数:void MyFunc(){},被编译成函数: _Z6Myfuncv
这样就引起了在c++中调用c语言编写的一个模块中的函数时,根据c++的查找方式去链接这个模块中的函数就会发生链接错误
拿上面的举例:myfun用c语言就被编译成 MyFunc,c++去查找myfun时链接的是_Z6Myfuncv,而这时候就会找不到这个函数发生链接错误,解决方式就是用extern "c"解决,加上extern "c"声明,就是告诉编译器按c语言的方式去编译和链接
代码如下
c.h
#ifndef C_H//防止头文件重复包含,条件编译意思是如果没有定义C_H就执行#ifndef C_H/#endif之间的代码,如果定义了就不执行
#define C_H
#include<stdio.h>
#ifdef __cplusplus//这个宏在cpp文件中是默认定义的
extern "C" {
#endif /* __cplusplus */
void print();
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif
c.c
#include"c.h"
void print()
{
printf("%s\n", "hello,hero");
}
main.cpp//c++程序调用c语言程序
#include "c.h"
#include<iostream>
using namespace std;
int main()
{
print();
system("pause");
}
结果如下:
如果没有加上extern "c"时,链接时会报错
头文件去掉extern "c"时代码如下
c.h
#ifndef C_H//防止头文件重复包含,条件编译意思是如果没有定义C_H就执行#ifndef C_H/#endif之间的代码,如果定义了就不执行
#define C_H
#include<stdio.h>
//#ifdef __cplusplus//这个宏在cpp文件中是默认定义的
//extern "C" {
//#endif /* __cplusplus */
void print();
//#ifdef __cplusplus
//}
//#endif /* __cplusplus */
#endif
编译结果如下:链接出错