被extern "C" 修饰后按照C语言编译 录屏软件 FSCapture extern "C" c语言编译 会发现报错,C语言不支持函数重载 还可以extern "C" {}全部包含修饰;只声明函数声明的地方也可以 使用语言都会使用到第三方框架/库 将函数的实现放到源文件C,将函数的声明放到头文件,方便大量文件使用 C++使用库文件时直接包含 直接将extern "C"放头文件中,但是要考虑C语言的库在C语言中也会调用的问题 C和C++同时调用C语言库,不是C++环境extern "C"将不起作用 用这个#define __cplusplus宏的差异来区分是不是C++环境 防止重复包含,包起来判断 pragma once防止整个文件的内容被重复包含,较老编译器不支持,如GCC3.4版本之前

#include <iostream>
using namespace std;

extern "C" void func() {

}

extern "C" void func(int v) {
	
}

int main() {

	getchar();
	return 0;
}

使用语言都会使用到第三方框架/库

可能是用C语言写的开源库

  • C++想调用开源C语言的库 使用extern "C" {}
    math.c
int sum(int v1, int v2){
    return v1 + v2;
}

int delta(int v1, int v2) {
    return v1 - v2;
}

将函数的实现放到源文件C,将函数的声明放到头文件,方便大量文件使用

被extern "C" 修饰后按照C语言编译
录屏软件 FSCapture
extern "C" c语言编译  会发现报错,C语言不支持函数重载
还可以extern "C" {}全部包含修饰;只声明函数声明的地方也可以
使用语言都会使用到第三方框架/库
将函数的实现放到源文件C,将函数的声明放到头文件,方便大量文件使用
C++使用库文件时直接包含
直接将extern "C"放头文件中,但是要考虑C语言的库在C语言中也会调用的问题
C和C++同时调用C语言库,不是C++环境extern "C"将不起作用
用这个#define __cplusplus宏的差异来区分是不是C++环境
防止重复包含,包起来判断
pragma once防止整个文件的内容被重复包含,较老编译器不支持,如GCC3.4版本之前

C++使用库文件时直接包含

#include <iostream>
using namespace std;

extern "C" {
    #include "math.h"
}

int main() {

	cout << sum(10, 20) << endl;
	cout << delta(10, 20) << endl;

	getchar();
	return 0;
}

#include <iostream>
using namespace std;

#include "math.h"


int main() {

	cout << sum(10, 20) << endl;
	cout << delta(10, 20) << endl;

	getchar();
	return 0;
}

这需要宏定义 
编译器在C++环境里面预先定义了一个宏,只要是C++文件就有一个隐形的宏存在
#define __cplusplus    定义在最前面,隐形的代码,如下所示

#define __cplusplus    //c++文件默认加的,看不见,不需要额外写
#include <iostream>
using namespace std;

用这个#define __cplusplus宏的差异来区分是不是C++环境

头文件的math.h定义

#ifdef __cplusplus
extern "C" {
#endif

	int sum(int v1, int v2);
	int delta(int v1, int v2);

#ifdef __cplusplus
}
#endif

防止重复包含,包起来判断

#ifndef ABC     //判断宏ABC有没有定义
#define ABC     
#endif
  • 最终头文件如下,判断是否重复定义宏
    特殊的宏用__表示切大写
#ifndef __MATH.H     //没有就定义,保证宏与文件一一对应
#define __MATH.H

#ifdef __cplusplus
extern "C" {
#endif
	int sum(int v1, int v2);
	int delta(int v1, int v2);
#ifdef __cplusplus
}
#endif

#endif

pragma once防止整个文件的内容被重复包含,较老编译器不支持,如GCC3.4版本之前

#pragma once  //放最前面就可以,保证后面的内容不一样
...