extern "c"的使用
为什么要有 extern “C”
在大工程中,存在C和C++混合编译,此时存在不同编译器编译出来的目标文件和库
当C++工程存在C编译器编译出的目标文件时,会出现找不到对应函数的情况
原因是:C编译器和C++编译器编译同一个函数时,得到汇编代码对应的函数名字是不一样的
(原因是C++存在函数重载,而C不存在,C++对于函数名还多了一些前缀和后缀—“粉碎重改”)
add.h
#ifndef __ADD
#define __ADD
#ifndef __cplusplus //编译器宏,若是c++编译器编译该函数成为目标文件或库,则不用extern "C",
extern "C"
{
#endif
int add(int x,int y);
#ifndef __cplusplus
}
#endif
#endif
add.c
#include"add.h"
int add(int x,int y)
{
return x+y;
}
main.cpp
#include<iostream>
#include"add.h"
using namespace std;
int main()
{
int result=add(10,11);
cout<<"result:"<<result<<endl;
return 0;
}
操作1:gcc -c add.c //使用gcc编译add.c为add.o
g++ add.o main.cpp
有了extern "C"才能成功编译
操作2:g++ -c add.c //使用g++编译add.c为add.o
g++ add.o main.cpp
此时要条件编译extern “C”,如果是g++编译出的add.o则不用extern “C”
如果全程都是C++编译器编译,则无需extern “C”