extern “C“使用方法__演变过程

目录

  • [一、概念:被extern "C"修饰的代码会按照C语言的方式去编译。](#一、概念:被extern "C"修饰的代码会按照C语言的方式去编译。)
    • [1. 直接使用extern "C"](#1. 直接使用extern "C")
    • [2.extern "C" { }](#2.extern "C" { })
  • [二、如果函数同时有声明和实现,要让函数声明被extern "C"修饰,函数实现可以不修饰](#二、如果函数同时有声明和实现,要让函数声明被extern "C"修饰,函数实现可以不修饰)
  • 三、由于C、C++混合开发

一、概念:被extern "C"修饰的代码会按照C语言的方式去编译。

1. 直接使用extern "C"

cpp 复制代码
#inlcude <iostream>
using namespace std;
extern "C" void func(){
	cout << "func()" << endl;
}

extern "C" void func(int arg){
   cout << "func(int arg)" << endl;
}

int main() {
	
	return 0;
}

上面的例子,如果取消extern "C",编译不会报错,因为C++支持函数重载,加上extern "C"后按照C语言的方式编译会提示重定义。

2.extern "C" { }

cpp 复制代码
extern "C" {
	void func(){
		cout << "func()" << endl;
	}
	
	void func(int arg){
	   cout << "func(int arg)" << endl;
	}
}

二、如果函数同时有声明和实现,要让函数声明被extern "C"修饰,函数实现可以不修饰

cpp 复制代码
extern "C" void func();
// 或 extern "C"{ void func(); }

void func(){
	cout << "func()" << endl;
}

三、由于C、C++混合开发

1.第三方库可能是C写的。

c库

c 复制代码
int sum(int v1, int v2) {
	return v1 + v2;
}
int delta(int v1, int v2) {
	return v1 - v2;
}

c++无法按下面方法直接调用,会提示找不到函数

c 复制代码
int main() {
	cout << sum(10, 20) << endl;
	cout << delta(30, 20) << endl;
	return 0;
}

可以按照以下方式来调用

cpp 复制代码
extern "C" {  //只需要修饰声明
	int sum(int v1, int v2);
	int delta(int v1, int v2);	
}
int main() {
	cout << sum(10, 20) << endl;
	cout << delta(30, 20) << endl;
	return 0;
}

如果其他cpp文件调用c库时,又需要extern "C" {};肯定不行,

一般将extern "C" {},放到头文件声明中,但在C环境中又不识别extern "C" ;

最终通过条件编译来解决同时在c,c++中使用的问题。

Cpp文件,默认带有 #define __cplusplus

所以有最终版本,头文件中:

cpp 复制代码
#ifndef __MATH_H
#define __MATH_H

#ifdef __cplusplus
	extern "C" {
#endif // __cplusplus

	int sum(int v1, int v2);
	int delta(int v1, int v2);
	
#ifdef __cplusplus
	}
#endif // __cplusplus

#endif //__MATH_H
相关推荐
努力实干30 分钟前
C++ 面向对象与工程架构
开发语言·c++·架构
代钦塔拉36 分钟前
【C++/Qt 进阶】设计模式系列(6):桥接模式——把“两个独立变化的维度“拆开
c++·qt·设计模式
水饺编程42 分钟前
第2章:Linux 基础,关机命令
linux·c语言·汇编
青少儿编程课堂1 小时前
蓝桥杯·全国青少年信息素养大赛·电子学会Python/C/C++考级:任意进制互转与大数多进制加法解析
c++·python·算法·bfs·信息学竞赛
Shadow(⊙o⊙)1 小时前
仿muduo实现高并发服务器——EPOLL设置与移除Poller.hpp管理Channel
运维·服务器·c++
闻缺陷则喜何志丹1 小时前
【C++特性及类库】多线程
开发语言·c++·多线程·语言特性·系统库
多弗朗皮卡丘1 小时前
C++ 哈希(下)
c++·算法·哈希算法
dtq04241 小时前
C++3 - 分支语句if和string变量
开发语言·c++·学习
jimy11 小时前
c++类成员访问只看静态类型
开发语言·c++
Brilliantwxx1 小时前
【Linux】IO(上)全篇:文件本质、C 接口、系统调用与文件描述符
linux·运维·服务器·c语言