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

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语言编程C++编辑器及调试工具操作命令详解

    C语言编程C++编辑器及调试工具操作命令详解 1. 编辑器 1.1 什么是编辑器 编辑器是一种用于编写程序源码的软件,常用的编辑器有Visual Studio Code、Sublime Text、Notepad++等。 1.2 Visual Studio Code Visual Studio Code是一款免费开源的文本编辑器,可以在Windows、Linu…

    C 2023年5月23日
    00
  • C++11智能指针中的 unique_ptr实例详解

    C++11智能指针中的 unique_ptr实例详解 简介 在C++11中,引入了新的智能指针模板类unique_ptr,它能自动管理动态内存,从而避免内存泄漏和野指针等问题。unique_ptr是一个独占式智能指针,它禁止拷贝和赋值,并在生命周期结束时自动释放内存。 本篇文章将详细介绍unique_ptr的使用方法和注意事项,并结合实例进行说明。 uniq…

    C 2023年5月23日
    00
  • Go错误和异常CGO fallthrough处理教程详解

    Go错误和异常CGO fallthrough处理教程详解 异常和错误的区别 在Go语言中,没有类似于Java的异常处理机制,而是采用了错误处理机制。Go语言中的错误是一种可以提前预判到的普通值,包含了自定义的错误信息。与其他语言不同,Go语言中的错误处理是基于返回值的,而不是异常。 如何处理错误 在Go语言中,一个函数的返回值通常由一个值和一个错误组成。当函…

    C 2023年5月23日
    00
  • C++中如何将数据保存为CSV文件

    C++中可以使用标准库中的fstream类来将数据保存为CSV文件。下面是完整的攻略: 步骤一:打开文件 首先,可以使用fstream类中的open函数打开一个CSV文件,打开文件需要指定需要操作的文件名、打开方式和文件存取权限。如果文件不存在,则可以使用out模式或者app模式创建文件,如果文件已经存在,则可以使用in模式或者in+out模式打开文件。 #…

    C 2023年5月23日
    00
  • C语言 按引用函数调用

    当我们在C语言中使用函数调用时,可以通过传递指针的方式来实现按引用传递。这样可以使我们在函数内操作原始变量的值,而不是复制一份它的值。以下是完整的C语言按引用函数调用的使用攻略: 函数声明 在定义函数时,加上*运算符来指明参数是一个指针,如下面的例子: void swap(int *x, int *y); 函数定义 定义函数时,如下面的例子,使用*运算符从参…

    C 2023年5月9日
    00
  • C++ Boost Chrono实现计时码表流程详解

    C++ Boost Chrono实现计时码表流程详解 什么是 Boost Chrono Boost Chrono 是 Boost 库中的一个计时库,提供了比标准 C++ 库更加方便和易于使用的时间测量和转换功能。它可以执行时间间隔的测量,并将时间表示为一种时间点,可以进行加,减和其他运算。同时也提供了格式化输出时间和日期的函数。 Boost Chrono 的…

    C 2023年5月23日
    00
  • C指针原理教程之编译原理-小型计算器实现

    为了实现一个小型计算器,我们需要了解C语言中指针的使用原理和编译原理。以下是详细的攻略: 编译原理基础 编译器是将高级语言程序转换为机器语言程序的软件。编译过程分为四个阶段:预处理、编译、汇编和链接。具体步骤如下: 预处理:处理以#开头的预编译指令,如#include和#define。 编译:将源代码翻译成汇编语言。 汇编:将汇编语言转换成机器代码。 链接:…

    C 2023年5月23日
    00
  • C++中构造函数与析构函数的调用顺序详解

    当我们使用C++来编写程序时,构造函数和析构函数是非常重要的。了解它们的调用顺序是编写高质量代码的关键之一。本攻略将针对C++中构造函数和析构函数的调用顺序进行详细讲解。 构造函数和析构函数 在了解构造函数和析构函数的调用顺序之前,我们需要先了解它们的作用和定义。在C++中,构造函数用于在创建对象时初始化对象的成员变量,而析构函数则在对象生命周期结束时释放资…

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