FX-extern C

news/2025/3/14 11:31:23/
  1. C++调用C语言编写的函数

    • 当C++代码需要调用C语言编写的函数时,使用extern "C"告诉编译器按照C语言的方式处理函数名。

  2. C语言调用C++编写的函数

    • 当C语言代码需要调用C++编写的函数时,使用extern "C"确保函数名不被修饰。

  3. 与C语言库交互

    • 许多系统库或第三方库是用C语言编写的,使用extern "C"可以确保C++代码能够正确链接这些库。


extern "C"的语法

extern "C"可以用于单个函数、多个函数或整个头文件。

1. 单个函数
extern "C" void myFunction(int a, int b);
2. 多个函数
extern "C" {void function1(int a);void function2(double b);
}
3. 整个头文件
extern "C" {#include "my_c_library.h"
}

示例:C++调用C语言函数

假设有一个C语言编写的函数,需要在C++中调用。

C语言代码(my_c_code.c
#include <stdio.h>void myCFunction() {printf("This is a C function.\n");
}
C++代码(main.cpp
#include <iostream>// 告诉编译器 myCFunction 是用 C 语言编写的
extern "C" void myCFunction();int main() {std::cout << "Calling a C function from C++..." << std::endl;myCFunction();  // 调用 C 语言函数return 0;
}
编译和链接
  1. 编译C语言代码:

    gcc -c my_c_code.c -o my_c_code.o
  2. 编译C++代码:

    g++ -c main.cpp -o main.o
  3. 链接生成可执行文件:

    g++ main.o my_c_code.o -o my_program
  4. 运行程序:

    ./my_program

输出:

Calling a C function from C++...
This is a C function.

示例:C语言调用C++函数

假设有一个C++编写的函数,需要在C语言中调用。

C++代码(my_cpp_code.cpp
#include <iostream>// 告诉编译器 myCppFunction 使用 C 语言的链接方式
extern "C" void myCppFunction() {std::cout << "This is a C++ function." << std::endl;
}
C语言代码(main.c
#include <stdio.h>// 声明 C++ 函数
void myCppFunction();int main() {printf("Calling a C++ function from C...\n");myCppFunction();  // 调用 C++ 函数return 0;
}
编译和链接
  1. 编译C++代码:

    g++ -c my_cpp_code.cpp -o my_cpp_code.o
  2. 编译C语言代码:

    gcc -c main.c -o main.o
  3. 链接生成可执行文件:

    g++ main.o my_cpp_code.o -o my_program
  4. 运行程序:

    ./my_program

输出:

Calling a C++ function from C...
This is a C++ function.

注意事项

  1. 名称修饰

    • C++编译器会对函数名进行名称修饰以支持函数重载,而C语言不会。使用extern "C"可以避免名称修饰。

  2. 函数重载

    • extern "C"块中不能定义重载函数,因为C语言不支持函数重载。

  3. C++特性

    • extern "C"块中不能使用C++特有的特性(如类、模板、命名空间等)。

  4. 头文件保护

    • 如果头文件可能被C和C++代码同时包含,可以使用以下方式保护:

      #ifdef __cplusplus
      extern "C" {
      #endifvoid myFunction(int a, int b);#ifdef __cplusplus
      }
      #endif

总结

  • extern "C"用于在C++和C语言之间实现互操作。

  • 它告诉编译器按照C语言的方式处理函数或变量的链接,避免名称修饰。

  • 常用于C++调用C语言库,或者C语言调用C++函数。

  • 使用时需要注意C和C++的语法和特性差异。


http://www.ppmy.cn/news/1579032.html

相关文章

css基本功

为什么 ::first-letter 是伪元素&#xff1f; ::first-letter 的作用是选择并样式化元素的第一个字母&#xff0c;它创建了一个虚拟的元素来包裹这个字母&#xff0c;因此属于伪元素。 grid布局 案例一 <!DOCTYPE html> <html lang"zh-CN"><head&…

KICK第四讲Linux 系统下安装 GCC 编译器全指南

Linux 系统下安装 GCC 编译器全指南 GCC&#xff08;GNU Compiler Collection&#xff09;是 Linux 系统下最常用的编译器之一&#xff0c;支持 C/C、Java 等多种编程语言。本文将介绍不同 Linux 发行版下的安装方法&#xff0c;帮助开发者快速配置开发环境。 一、使用包管理…

RHCE(RHCSA复习:虚拟的安装和设置)

一、安装虚拟机&#xff08;见截图&#xff09; 虚拟机放大&#xff1a;ctrlshift加号 虚拟机缩小&#xff1a;ctrl减号 连接xshell的命令&#xff1a; ssh root(加上自己的ip)虚拟机关机的命令&#xff1a; systemctl poweroff 或者init 0&#xff08;该命令很古老&#xff…

经典可验证文献阅读VerifyNet: Secure and Verifiable Federated Learning

系列文章目录 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 例如&#xff1a;第一章 Python 机器学习入门之pandas的使用 联邦学习作为一种新兴的神经网络训练模型&#xff0c;由于其无需采集用户原始数据就能更新参数的能力而受到广…

【数据库】10分钟学会MySQL的增删改查:数据库、表、表记录操作指南

MySQL作为一种广泛使用的开源关系型数据库管理系统&#xff0c;提供了强大的数据操作功能。增删改查&#xff08;CRUD&#xff09;是数据库操作的核心&#xff0c;涵盖创建&#xff08;Create&#xff09;、读取&#xff08;Read&#xff09;、更新&#xff08;Update&#xff…

搭建【Dify】大语言模型(LLM)应用开发平台的详细指南

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《深度探秘&#xff1a;AI界的007》 &#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、引言 1、什么是Dify 2、Dify应用场景 二、Dify的核心功能与…

《解锁Flutter:跨平台开发的未来之光》

《解锁Flutter&#xff1a;跨平台开发的未来之光》 Flutter&#xff1a;崭新时代的跨平台框架 在当今数字化浪潮中&#xff0c;移动应用已成为人们生活中不可或缺的一部分。无论是购物、社交、娱乐还是办公&#xff0c;我们都离不开各种手机应用。而在移动应用开发领域&#…

springboot_data介绍

Spring Boot 数据访问全面指南&#xff1a;SQL与NoSQL深度整合 一、技术全景解析 1.1 核心架构设计 Spring Boot数据访问采用分层架构模式&#xff0c;核心组件包括&#xff1a; ┌───────────────┐ ┌───────────────┐ │ Control…