extern是C/C++语言中表明函数和全局变量作用范围(可见性)的关键字,该关键字告诉编译器,其声明的函数和变量可以在本模块或其它模块中使用。
extern “C”
1.目的:
为了能够正确实现C++代码调用其他C语言代码,会指示编译器extern "C"修饰的变量和函数是按照C语言方式进行编译和链接的
2.原理:
作为一种面向对象的语言,C++支持函数重载,而过程式语言 C 则不支持。函数被 C++编译后在符号库中的名字与 C 语言的不同。
因为C++编译后在符号库中的名字与函数名、函数参数数量及类型信息有关,C编译后在符号库中的名字只与函数名有关。
实例C++调用C
//ctest.c
#include "ctest.h"
void test(int a, double b) {
printf("a: %d\n", a);
printf("b: %lf\n", b);
}
头文件中的编译宏的作用是防止该头文件被重复引用。
//ctest.h
#ifndef CTEST_H
#define CTEST_H
#include <stdio.h>
void test(int, double);
#endif
//c++_use_c.cpp
extern "C" void test(int, double);
//extern void test(int, double);
int main() {
test(2, 1.4);
return 0;
}
注意
(1)链接指示extern "C"中的“C"代表的并不是C语言,而是用extern ”C“来声明非C++函数;实际上Fortran和汇编语言也常常使用,因为它们也正好符合C实现的约定。支持什么语言由编译器而定,C++保证支持的唯一语言是C
(2)extern ”C“必须出现在函数的第一次声明上。