C/C++中extern “C” 的作用分析

yizhihongxing

C++代码需要与C代码进行链接时,由于C++编译器经过了重载和命名改编等操作,因此函数名、变量名等有时需要进行改变,此时如果C++代码直接链接C代码,则可能会发生链接错误。为了解决这个问题,C++提供了extern "C"语法来解决此类问题。

一、extern "C"语法介绍

extern "C"是C++中用于链接C代码的一种机制。当代码被extern "C"包裹时,C++编译器会禁止C++的命名重载和改名功能,从而使得C++代码可以与C代码进行符号链接。例如:

// test.cpp
extern "C" void hello()
{
    printf("Hello\n");
}

int main()
{
    hello();
    return 0;
}

代码中的extern "C"语法使得hello函数的名字不会在编译时进行改名,从而使C++编译器可以正确识别这个函数并与C代码进行链接,最终实现代码的正确运行。

二、extern "C"语法的注意点

1. 什么情况下需要使用extern "C"

当C++代码需要与C代码进行链接时,由于C++编译器对函数进行了改名,因此需要使用extern "C"机制来消除这种改名。一般情况下,当我们需要调用一个C源文件中的函数时,就需要使用extern "C"语法。

2. extern "C"语法放在哪里

在C++中,extern "C"可以与函数声明或定义一起使用。例如:

// test.cpp
extern "C" {
    void hello();
}

int main()
{
    hello();
    return 0;
}

// hello.c
void hello()
{
   printf("Hello World!\n");
}

3.extern "C"语法的作用对象

extern "C"语法不仅可以用于函数定义中,还可以用于变量、结构体和类的声明或定义中。

三、extern "C"语法示例

1.使用extern "C"链接C++和C代码

我们定义一个C++程序,再定义一个C文件,并在C++程序中调用C函数。

//test.cpp
#include <iostream>
extern "C" {
    #include <stdio.h>
}

void hello(){
  std::cout<<"Hello"<<std::endl;
}

int main(){
  hello();
  hello_world();
  return 0;
}

//hello.c
void hello_world(){
  printf("Hello, world!");
}

我们在C++中定义了一个hello函数,同时也在函数中通过extern "C"来调用了hello_world函数(这个函数定义在C文件中),最后实现了对C语言代码的调用。

2. 调用C++内部函数

我们定义一个C++程序,然后我们在其中调用C++的函数。这里不需要用到extern "C"

//test.cpp
#include <iostream>

void hello(){
  std::cout<<"Hello"<<std::endl;
}

int main(){
  hello();
  return 0;
}

上述代码在C++中定义了一个hello函数,而在main函数中调用了它。因为C++内部的函数在编译时不会进行命名重载和改编,因此不需要使用extern "C"语法

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C/C++中extern “C” 的作用分析 - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • c++关键字const的用法详解

    下面就是对“c++关键字const的用法详解”的完整攻略。 什么是const const 是 C++ 中的一个关键字,用来定义常量。在 C++ 中,常量是指不能被修改的值。 const的用法 1. 修饰变量 const 可以用来定义一个常量变量,被 const 修饰的变量一旦被初始化,就不能被修改。 示例代码: const int a = 10; 2. 修饰…

    C 2023年5月22日
    00
  • 如何解决电脑提示应用程序正常初始化(0xc0000142)失败的问题

    问题描述: 在电脑打开某些应用程序时,会出现类似于以下提示的错误信息: “应用程序无法正常启动(0xc0000142)。单击[确定]关闭应用程序。” 这种错误表示该应用程序无法正常初始化,有可能是因为它受到了病毒、间谍软件、不完整的应用程序更新或者系统中的故障等因素的影响。 针对这种错误,以下是一些可以尝试的解决方案: 1. 运行挂起的服务 如果该错误是因为…

    C 2023年5月23日
    00
  • C语言 完整游戏项目坦克大战详细代码

    首先,这篇文章介绍了一个完整游戏项目坦克大战的详细代码。坦克大战是一个经典的双人游戏,玩家可以控制自己的坦克通过射击、躲避敌方坦克、摧毁敌方基地等方式获得胜利。本文详细地介绍了该游戏的 C 语言代码实现过程,包括游戏界面的设计、坦克、子弹、道具的实现、敌方 AI 的设计以及游戏结束的处理等内容。 在这篇文章中,代码示例是非常重要的,它能够直观地展示程序的实现…

    C 2023年5月24日
    00
  • javax.net.ssl.SSLException: java.lang.RuntimeException: Could not generate DH keypair 解决方法总结

    首先,这个错误是由于JDK 8及以上版本中的加密协议更新导致的。要解决这个问题,有两种方法可以尝试。 方法1:强制使用TLSv1协议 这个方法非常简单,只需要在程序中强制使用TLSv1协议即可,特别是对于需要与老版本的服务器进行交互的情况,更是非常适用。 在使用HttpsURLConnection类时,可以通过如下代码强制使用TLSv1协议: System.…

    C 2023年5月22日
    00
  • vscode调试gstreamer源码的详细流程

    下面是vscode调试gstreamer源码的详细攻略,步骤如下: 步骤一:安装依赖项 在调试gstreamer源码前,我们需要先安装一些依赖项,以便能够编译和运行gstreamer源码,需要安装以下依赖项: glib >= 2.40.0 libxml2 >= 2.4.16 bison >= 2.1 flex >= 2.5.35 py…

    C 2023年5月23日
    00
  • 如何寻找数组中的第二大数

    如何寻找数组中的第二大数是一个比较常见的问题。下面我将为大家详细讲解如何寻找数组中的第二大数的完整攻略。 1. 题目理解 首先需要明确题目的意思。题目所说的数组是一个由整数组成的序列。其次,题目要求找到数组中第二大的数,也就是说要找到所有元素中第二大的数。 2. 方法总结 如何在一个数组中找到第二大的数呢?下面是一些比较常见的方法: 方法一:排序 排序是一种…

    C 2023年5月23日
    00
  • C语言传递指向常量的指针

    下面详细讲解C语言中传递指向常量的指针的完整使用攻略。 什么是指向常量的指针? 指向常量的指针是指在指针声明中加上const关键字,以表明该指针指向的变量是不可变的,如下所示: const int *ptr; 上述代码表示ptr是一个指向常量整型数的指针,即指向的变量是不可变的。 如何传递指向常量的指针? 在函数声明中,我们可以使用const关键字来表明参数…

    C 2023年5月9日
    00
  • NBA2KOL戴维斯投篮包怎么样 C级球员投篮包介绍

    NBA2KOL戴维斯投篮包怎么样 简介 NBA2KOL戴维斯投篮包是一种帮助球员提高投篮能力的道具,适用于NBA2KOL游戏中的C级球员。该投篮包的特点是能够提高球员相对上篮得分和中投得分的成功率,让球员在比赛中更容易得分。 获取方式 NBA2KOL戴维斯投篮包可以通过在游戏商店中购买获得。玩家需要使用游戏中的虚拟货币购买投篮包。 使用方法 使用NBA2KO…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部