为什么会有extern “C”?
由于C.C++编译规则不同,再C和C++混合开发时候,可能会出现extern “C”
1.在函数实现前加
extern "C" void func() {
cout << "func()" << endl;
}
2.直接包裹住C语言函数
extern "C" {
void func() {
cout << "func()" << endl;
}
void func(int a) {
cout << "func(int a)" << endl;
}
}
3.如果函数有声明,extern “C”加在函数声明的前面
extern "C" void func(int a);
或包裹住C函数的声明
extern "C" {
void func(int a);
void func();
}
4.如果是有.h和.c文件,如下代码
sum.h的声明
// 防止头文件重复导入
#ifndef __SUM_H
#define __SUM_H
int sum(int a, int b);
#endif // !__SUM_H
注意:
#pragma once
也可以实现整个文件防止头文件重复导入- 定义宏
__SUM_H
建议以双下划线__开头,以文件名(防止宏重复定义)的大写,加上下划线_H(表示.h头文件)表示
sum.c的实现
#include "sum.h"
int sum(int a, int b) {
return a + b;
}
直接声明头文件
extern "C" {
#include "sum.h"
}
4.1.如果编写了C函数库,给别人使用,如果是C语言环境就用C的编译规则,如果是C++环境,就用C++编译 别人使用你的C函数库,只需要导入头文件,比如
#include <iostream>
using namespace std;
#include "sum.h"
int main() {
cout << sum(1, 2) << endl;
getchar();
return 0;
}
需要使用__cplusplus宏
// 防止头文件重复导入
#ifndef __SUM_H
#define __SUM_H
#ifdef __cplusplus
// 颜色是浅色的,说明如果是C语言就不参与编译,如果是C++环境就参与编译
extern "C" {
#endif // __cplusplus
int sum(int a, int b);
#ifdef __cplusplus
}
#endif // __cplusplus
#endif // !__SUM_H