【C++】extern “C“ 用法详解

2023-05-16

前言

前面简单了解了C++中的extern "C"之后,可能很多小伙伴对这个陌生的词非常困惑,不能理解他的使用场景。

所以本章内容就来详细了解extern "C"的用法,这里使用栈的一个OJ题来举例。

使用场景

题目在这里---->有效的括号

解题方法在这里--->栈和队列经典OJ练习 

在这里我们解这道题需要使用栈,有两种方法,第一种方法是自己写一个栈;第二种方法是调用别人已经写好编译好的库。(当然这里为了演示我们选择第二种方法)

程序代码:

#include<iostream>
using namespace std;


bool isValid(const char* s) {
    Stack st;
    StackInit(&st);
    while (*s)
    {
        if ((*s == '(') || (*s == '[') || (*s == '{'))
        {
            StackPush(&st, *s);
            s++;
        }
        else
        {
            if (StackEmpty(&st))
            {
                return false;
            }
            char tmp = StackTop(&st);
            StackPop(&st);
            if ((tmp == '(' && *s != ')')
                || (tmp == '[' && *s != ']')
                || (tmp == '{' && *s != '}'))
            {
                return false;
            }
            else
            {
                s++;
            }
        }
    }
    bool ret = StackEmpty(&st);
    return ret;

}


int main()
{
    cout << isValid("{[]}") << endl;
    cout << isValid("([)]") << endl;
    return 0;
}

静态库的创建:

动态库/静态库,目前我也不太清楚,这里的知识后面学习了再补充,现在就理解成别人写好给你用的被编译好的程序就可以了。

这里简单介绍一下怎么样创建一个静态库:

 

 然后将栈的实现放到静态库中,这样一个静态库就创建好了。

1.C++程序调用C写的动态库/静态库 

现在创建好了一个用C++写的程序,然后调用C语言写的库。

首先需要包含头文件,而这里与以前包含的方式不同:

#include"../Stack/stack.h"

 . 表示当前目录

..表示上一层目录

然后我们来运行一下:

但这里出现了链接错误,这里有两个原因:

1.C++程序会使用被修饰后的函数名在C的静态库中寻找,而静态库中的函数名没有被修饰。

2.这里只包含了Stack.h文件,只有声明,没有定义,没有地址,找不到这些函数。

下面来链接静态库

 

 这一步是将静态库中的Stack.lib文件添加

再来运行一下:

还是不行,我们将静态库中的文件名后缀改成.cpp试一下:

 然后就编译成功了:

以上说明现在就是第一个问题了:C++的函数名修饰规则在查找函数名时与C语言不同,导致在静态库中找不到这些函数。所里这里的主角来了:extern "C" 

方法:

这段代码的意思是:告诉编译器在调用这个静态库时,调用函数使用C的风格去调用(即调用函数时不使用函数名修饰规则)

最后我们就能正确运行程序:

 2.C程序调用C++写的动态库/静态库 

用一个C程序调用C++写的静态库,前面的包含静态库的步骤类似,就不再重复演示了。

但这里extern "C"使用时与前面有区别,因为C语言的语法中不支持 extern "C",所以只能在C++的静态库中使用。

这里C程序调用C静态库是能运行的:

然后将C静态库改成C++静态库:

运行一下:C程序无法调用C++静态库中函数名被修饰的函数

所以需要在C++静态库中使用extern "C"

当然可能在有些编译器下直接使用可能会报错,因为包含头文件之后会将静态库中的内容展开到C程序中,但是C程序不支持extern "C",这里就无法识别。

使用条件编译:

现在就能正常运行了:

综上就是extern "C"的用法及使用场景。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【C++】extern “C“ 用法详解 的相关文章

随机推荐

  • 【tmp】python Queue和Thread结合使用

    Queue使用 xff1a https pymotw com 2 Queue https docs python org 2 library queue html Thread控制 xff1a http blog csdn net zhan
  • 算法工程师的自我修养(AlgorithmEngineerPrepares)

    算法工程师的自我修养 整理一份算法工程师的最小必需的知识框架 xff0c 内容包括 计算机视觉 机器学习基础 深度学习基础 数据处理分析 矩阵论 信息论 NLP基础 xff0c 持续更新中 xff0c 欢迎关注 地址 xff1a https
  • 从零开始实现一个简单的CycleGAN项目

    项目地址 xff1a https github com jzsherlock4869 cyclegan pytorch pytorch 中CycleGAN xff08 循环一致生成对抗网络 xff09 的简单且易于修改的实现 CycleGA
  • 【计算机视觉】一个简单易上手的图像分类任务pipeline代码

    整理了一个针对图像分类任务的pipeline xff0c 主要用于快速开始验证现有模型结果 xff0c 以及后续的自定义模型的开发 https github com jzsherlock4869 image classification p
  • MySQL存储数据加密

    加密方式主流的有两种 ENCODE 与 DECODE 建一张测试表 create table users username varchar 128 用户昵称 password blob 密码 engine 61 innodb default
  • 线程池BUG复现和解决

    逻辑很简单 xff0c 线程池执行了一个带结果的异步任务 但是最近有偶发的报错 xff1a java util concurrent RejectedExecutionException Task java util concurrent
  • 移动端开发——APP端上H5容器化建设

    1 背景 当前移动端和前端的结合愈加紧密 xff0c 尤其是在偏重活动运营的电商App中 xff0c 受制于App版本审核 xff0c 具备研发成本低 可灵活发布等特点的H5页面受到青睐 xff0c 使其在APP端上承接了越来越多的业务 然
  • C++时间与字符串转换

    1 常用的时间存储方式 1 xff09 time t类型 xff0c 这本质上是一个长整数 xff0c 表示从1970 01 01 00 00 00到目前计时时间的秒数 xff0c 如果需要更精确一点的 xff0c 可以使用timeval精
  • 解决linux环境下nohup: redirecting stderr to stdout问题

    在生产环境下启动Weblogic时 xff0c 发现原来好好的nohup信息输出到指定文件中的功能 xff0c 突然出问题了 现象是控制台输出的信息一部分输出到了我指定的文件 xff0c 另一部分却输出到了nohup out xff0c 而
  • [转]Redis作为消息队列与RabbitMQ的性能对比

    周末测试了一下RabbitMQ的性能 xff0c RabbitMQ是使用Erlang编写的一个开源的消息队列 xff0c 本身支持很多的协议 xff1a AMQP xff0c XMPP SMTP STOMP xff0c 也正是如此 xff0
  • Python3.7 实现TCP通信

    TCP 连接程序分为服务端和客户端两部分 服务端步骤如下 xff1a 1 创建套接字Socket 什么是套接字 应用层通过传输层进行数据通信时 xff0c TCP和UDP会遇到同时为多个应用程序进程提供并发服务的问题 为了区别不同的应用程序
  • CentOS、Ubuntu、Debian三个linux比较异同

    Linux有非常多的发行版本 xff0c 从性质上划分 xff0c 大体分为由商业公司维护的商业版本与由开源社区维护的免费发行版本 商业版本以Redhat为代表 xff0c 开源社区版本则以debian为代表 这些版本各有不同的特点 xff
  • LDAP 中 CN, OU, DC 的含义

    1 LDAP的存储规则 区分名 xff08 DN xff0c Distinguished Name xff09 和自然界中的树不同 xff0c 文件系统 LDAP 电话号码簿目录的每一片枝叶都至少有一个独一无二的属性 xff0c 这一属性可
  • bat修改hosts文件

    attrib R C WINDOWS system32 drivers etc hosts 64 echo 64 echo 127 0 0 1 aaaa bbb com gt gt C WINDOWS system32 drivers et
  • 使用org.apache.tools.zip实现zip压缩和解压

    import java io import org apache tools zip import java util Enumeration 功能 zip压缩 解压 支持中文文件名 说明 本程序通过使用Apache Ant里提供的zip工
  • freeModbus代码解读及移植笔记

    freeModbus的代码库还是很好用的 xff0c 本人在wince和C8051F410下均移植成功 xff08 只用到RTU模式 xff09 但freeModbus提供的文档比较少 xff0c 只能对照着Modbus协议一点点试着读懂源
  • MySQL变量:local_infile

    local infile服务器变量指示能否使用load data local infile命令 该变量默认为ON 该变量为OFF时 xff0c 禁用客户端的load data local infile命令 Sql代码 mysql gt sh
  • strcpy函数实现

    C语言标准库函数strcpy的一种典型的工业级的最简实现 返回值 xff1a 返回目标串的地址 对于出现异常的情况ANSI C99标准并未定义 xff0c 故由实现者决定返回值 xff0c 通常为NULL 参数 xff1a strDesti
  • C++库介绍

    1 C 43 43 标准库 xff08 STL xff09 STL六大组件 容器 算法 迭代器 仿函数 适配器 配接器 空间配置器 1 容器 各种数据结构 xff0c 如vector list deque set map等 xff0c 用来
  • 【C++】extern “C“ 用法详解

    前言 前面简单了解了C 43 43 中的extern 34 C 34 之后 xff0c 可能很多小伙伴对这个陌生的词非常困惑 xff0c 不能理解他的使用场景 所以本章内容就来详细了解extern 34 C 34 的用法 xff0c 这里使