C++中extern “C“的用法

目的

extern "C"是经常用到的东西,面试题目也经常出现,然则,实际用时,还是经常遗忘,因此,深入的了解一下,以增强记忆。

extern "C"指令非常有用,因为C和C++的近亲关系。

作用

注意:extern "C"指令中的C,表示的一种编译和连接规约,而不是一种语言。C表示符合C语言的编译和连接规约的任何语言,如Fortran、assembler等。

另外,extern "C"指令仅指定编译和连接规约,但不影响语义。例如在函数声明中,指定了extern "C",仍然要遵守C++的类型检测、参数转换规则。

综上所述,extern "C"的真实目的是实现类C和C++的混合编程。在C++源文件中的语句前面加上extern "C",表明它按照类C的编译和连接规约来编译和连接,

而不是C++的编译的连接规约。这样在类C的代码中就可以调用C++的函数或变量等。

生成符号的不同

在C和C++中,生成函数符号的方式有所不同。

在C语言中,函数的符号是通过函数名和参数类型来生成的。如果两个函数的名字相同并且参数类型也相同,那么它们的符号就是一样的。

在C++中,函数符号的生成则更加复杂,主要是因为C++支持函数重载,也就是说,两个函数可以有相同的名字,

只要它们的参数类型或者参数数量不同。为了区分这些同名函数,

C++编译器会将函数的返回类型,函数名,参数类型,参数数量,参数顺序等因素考虑进去,生成一个独一无二的符号。

情况

上面理论讲的很清楚,下面用例子试试:

先弄一个C++的函数例子:

cppFunc.h:

cpp 复制代码
#pragma once
#include <stdio.h>
void cppFunc(int num);
cppFunc.cpp:
#include "cppFunc.h"
void cppFunc(int num)
{
    printf("enter function cFunc num=%d\n", num);
    printf("exit function cFunc\n");
}

主函数:

cpp 复制代码
#include <iostream>
#include "cppFunc.h"
int main()
{
    cppFunc(10);
    std::cout << "Hello World!\n";
}

运行情况:

符号是这样的:

c++调用C函数的例子

cFunc.h:

cpp 复制代码
#pragma once
#include <stdio.h>
void cFunc(int num);

cFunc.c:

cpp 复制代码
#include "cFunc.h"
void cFunc(int num)
{
    printf("enter function cFunc num=%d\n", num);
    printf("exit function cFunc\n");
}

主函数:

cpp 复制代码
#include <iostream>
#include "cFunc.h"
//#include "cppFunc.h"
int main()
{
    cFunc(8);
    //cppFunc(10);
    std::cout << "Hello World!\n";
}

运行情况:

上面表明,C++按照C++的函数名规则去链接函数,符号为:?cFunc@@YAXH@Z 实际在OBJ中找不到。

从上图可知:c语言的名字就是 cFunc,所以找不到。

怎么找到呢?

主函数修改如下:

cpp 复制代码
#include <iostream>
extern "C"
{
#include "cFunc.h"
}
//#include "cppFunc.h"
int main()
{
    cFunc(8);
    //cppFunc(10);
    std::cout << "Hello World!\n";
}

运行情况:

这样就找到了,这样就按照C的规则去找相应的函数。

总结

extern "C"{},解决了C与C++编译结果的混用,如下图所示:

相关推荐
坚果派·白晓明10 分钟前
鸿蒙 PC应用集成 hwloc:3 大 NAPI & 编译坑详解
c语言·华为·ai编程·harmonyos·atomcode
zh_xuan18 分钟前
PC端操作SQLite数据库
数据库·c++·sqlite
CHHH_HHH26 分钟前
【C++】哈希表原理与实战:从冲突解决到性能优化
开发语言·数据结构·c++·学习·算法·哈希算法·散列表
fpcc39 分钟前
并行编程实战——CUDA编程的pipelines
c++·cuda
Tairitsu_H1 小时前
[LC优选算法#5] 分治:快排 | 颜色分类 | 排序数组 | 第K大元素
c++·算法·leetcode·排序算法·快速排序
人邮异步社区1 小时前
C语言进阶的书籍推荐
c语言·开发语言
Frank学习路上1 小时前
【C++】面试:STL容器与算法
c++·算法·面试
凡人叶枫1 小时前
Effective C++ 条款33:避免遮掩继承而来的名字
linux·服务器·开发语言·c++·嵌入式开发
10岁的博客1 小时前
NOIP2010普及组「接水问题」详解:模拟算法与优先队列解法
开发语言·c++·算法
凡人叶枫1 小时前
Effective C++ 条款31:将文件间的编译依存关系降至最低
linux·开发语言·c++·php·嵌入式开发·effective c++