extern

extern

在C++中常在头文件见到extern "C"修饰函数,是用于C++链接在C语言模块中定义的函数。extern用于标示变量或者函数的定义在别的文件中,extern "C"提示编译器遇到此变量和函数时在其他模块中寻找其定义告诉链接器去寻找_add这类的C语言符号,而不是经过C++修饰的符号。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//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;
}

//add.cpp
#include <iostream>
#include "add.h"
using namespace std;
int main() {
add(2,3);
return 0;
}

上面的代码就会报错,因为相同的函数,在C和C++中,编译后生成的符号不同。

1
2
3
4
5
6
7
8
9
#include <iostream>
using namespace std;
extern "C" {
#include "add.h"
}
int main() {
add(2,3);
return 0;
}

编译时需要通过gcc生成中间文件add.o

1
gcc -c add.c 

然后编译

1
g++ add.cpp add.o -o main

总结:

(1)C++调用C函数:

1
2
3
4
5
6
7
8
9
10
11
12
//xx.h
extern int add(...)

//xx.c
int add(){

}

//xx.cpp
extern "C" {
#include "xx.h"
}

C++确实是能够调用编译好的C函数

(2)C调用C++函数

1
2
3
4
5
6
7
8
9
10
//xx.h
extern "C"{
int add();
}
//xx.cpp
int add(){

}
//xx.c
extern int add();

把C++代码当成C代码编译后调用。也就是说,C并不能直接调用C++库函数。

C/C++中extern关键字详解 - chao_yu - 博客园 (cnblogs.com)

  • Copyrights © 2018-2022 Haojia Zhu
  • Visitors: | Views:

请我喝杯咖啡吧~

支付宝
微信