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++编译结果的混用,如下图所示:

相关推荐
鱼子星_7 分钟前
【C++】继承和多态(上)
c++·笔记
知无不研1 小时前
c语言中循环的介绍与简单应用
c语言·开发语言·算法·循环·for·while
郝学胜-神的一滴2 小时前
Qt 高级编程 045:坐标体系深度实战
开发语言·c++·windows·python·qt·程序人生
码匠许师傅2 小时前
【设计模式精讲】22.中介者模式(Mediator)
c++·设计模式·软件工程·uml·中介者模式
HRTOS3 小时前
HRTOS 4.0 驱动库:06_Storage 存储设备驱动——24C02 EEPROM与I²C驱动开发
c语言·驱动开发·嵌入式硬件·51单片机
爱吃巧克力的程序媛4 小时前
main.cpp注册 C++ 类到 QML 元对象系统
c++·qt
YYYing.4 小时前
【C++进阶系列 (二)】关于线程堆栈的那些事——函数调用过程
开发语言·c++·函数·线程堆栈
键盘会跳舞6 小时前
【C++多线程】死锁诊断工具实战:从 Windows 到 Linux 的全链路排查
linux·c++·windows·死锁
HugoStudio_SWAN6 小时前
洛谷 P10719 \[GESP202406 五级] 黑白格——暴力美学与图像处理的最小外接矩形
c++·图像处理·人工智能·学习·程序人生·算法·目标跟踪
jimy16 小时前
C++ 的 “移动语义”——Move Semantics
开发语言·c++