C++ EXTERN 关键词
C++虽然兼容C,但C++文件中函数编译后生成的符号与C语言生成的不同。因为C++支持函数重载,C++函数编译后生成的符号带有函数参数类型的信息,而C则没有。
例如int add(int a, int b)函数经过C++编译器生成.o文件后,add会变成形如 _Z3addii之类的, 而C的话则会是形如add, 就是说:相同的函数,在C和C++中,编译后生成 的符号不同。
这就导致一个问题:如果C++中使用C语言实现的函数,在编译链接的时候,会出错,提示找 不到对应的符号
C++ Call C
//add.h
#ifndef ADD_H
#define ADD_H
int add(int x,int y);
#endif
//add.c
#include "add.h"
int add(int x,int y) {
return x+y;
}
将上面的文件以C语言编译成对象文件后 gcc -c add.c -o add.o
以下调用会报链接错误 g++ add.cpp add.o -o main
//add.cpp
#include <iostream>
#include "add.h"
using namespace std;
int main() {
add(2,3);
return 0;
}
正确的调用方式如下
//add.cpp
#include <iostream>
using namespace std;
extern "C" {
#include "add.h"
}
int main() {
add(2,3);
return 0;
}
C Call C++
这不是默认允许的行为,除非能对C++的代码作修
// add.h
#ifndef ADD_H
#define ADD_H
extern "C" {
int add(int x,int y);
}
#endif
// add.cpp
#include "add.h"
int add(int x,int y) {
return x+y;
}
// add.c
extern int add(int x,int y);
int main() {
add(2,3);
return 0;
}
将以上文件编译成C++库后,add才能被C语言调用 g++ -c add.c -o add.o
// add.c
extern int add(int x,int y);
int main() {
add(2,3);
return 0;
}
gcc add.c add.o -o main