IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> extern “C“有什么用 -> 正文阅读

[C++知识库]extern “C“有什么用

?extern “C”作用是在c++中extern “C”修饰的符号都以c语言的方式编译。

1.c 语言和c++编译函数的区别。

? ? 先写一个简单的代码测试如下:

sum.h

#ifndef _SUM_H_
#define _SUM_H_

int sum(int , int);

#endif

sum.c

#include"sum.h"

int sum(int x, int y)
{
        return x + y;
}

makefile

all:
        gcc -c sum.c -o sum_c.o
        g++ -c sum.c -o sum_cpp.o

? ? 代码使用了g++和gcc来编译了sum.c得到了两个目标文件分别是sum_c.o 和sum_cpp.o。然后我们使用nm来查看这两个目标文件的符号,可以很清晰地看到c语言编译后得到的sum函数的符号就是函数的名字,而c++编译得到的符号是一个前缀+函数名字+参数的缩写(参数重载)。

2.c 和c++相互调用的问题

? ? 按照上面的描述c和c++相互调用时必然会出错,因为同样的一个函数会被编译成两个符号。链接的过程肯定会找不到彼此。继续测试如下:

main.cpp

#include<stdio.h>
#include"sum.h"

int main()
{
        printf("%d\n", sum(2, 3));
}

makefile

all:
        gcc -c sum.c -o sum_c.o
        g++ -c main.cpp -o main.o
        g++ main.o sum_c.o -o a_c.out

? ? 代码使用sum_c.o和mian.o编译链接得到可执行文件a_c.out。链接的时候报错了。

? ?继续用nm看一个sum_c.o和main.o中间sum有什么区别,果然对不上。

3.extern "C" 的作用

? ? 前面说过了extern "C"的作用就是将c++的代码按照c的方式编译,在上面的例子中主函数main是c++的,我们就需要在main.cpp中使用extern "C"修饰sum函数,让他在main.o的符号也是sum。修改代码如下:

main.cpp

#include<stdio.h>

#ifdef __cplusplus //如果是cpp代码时会进这个宏
extern "C"{
#include"sum.h"
#endif


#ifdef __cplusplus
}
#endif

int main()
{
        printf("%d\n", sum(2, 3));
}

这个时候再使用g++ sum_c.o main.cpp -o a_c.out来编译就不会失败了。再看一次符号,两者是一致的。

?同理,如果我们把文件名字改成main.c 和 sum.cpp,那么我们就需要在sum.cpp中间来加extern "C"了。

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-07-26 11:53:50  更:2021-07-26 11:54:28 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年4日历 -2024/4/26 21:48:21-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码