被extern "C" 修饰后按照C语言编译

录屏软件 FSCapture

extern "C" c语言编译 会发现报错,C语言不支持函数重载

#include <iostream>
using namespace std;

extern "C" void func() {

}

extern "C" void func(int v) {

}

int main() {

    getchar();
    return 0;
}

还可以extern "C" {}全部包含修饰;只声明函数声明的地方也可以

使用语言都会使用到第三方框架/库

可能是用C语言写的开源库

  • C++想调用开源C语言的库 使用extern "C" {}
    math.c
int sum(int v1, int v2){
    return v1 + v2;
}

int delta(int v1, int v2) {
    return v1 - v2;
}

将函数的实现放到源文件C,将函数的声明放到头文件,方便大量文件使用

C++使用库文件时直接包含

#include <iostream>
using namespace std;

extern "C" {
    #include "math.h"
}

int main() {

    cout << sum(10, 20) << endl;
    cout << delta(10, 20) << endl;

    getchar();
    return 0;
}

直接将extern "C"放头文件中,但是要考虑C语言的库在C语言中也会调用的问题

#include <iostream>
using namespace std;

#include "math.h"

int main() {

    cout << sum(10, 20) << endl;
    cout << delta(10, 20) << endl;

    getchar();
    return 0;
}

C和C++同时调用C语言库,不是C++环境extern "C"将不起作用

这需要宏定义
编译器在C++环境里面预先定义了一个宏,只要是C++文件就有一个隐形的宏存在
#define __cplusplus    定义在最前面,隐形的代码,如下所示

#define __cplusplus    //c++文件默认加的,看不见,不需要额外写
#include <iostream>
using namespace std;

用这个#define __cplusplus宏的差异来区分是不是C++环境
头文件的math.h定义

#ifdef __cplusplus
extern "C" {
#endif

    int sum(int v1, int v2);
    int delta(int v1, int v2);

#ifdef __cplusplus
}
#endif

防止重复包含,包起来判断

#ifndef ABC     //判断宏ABC有没有定义
#define ABC
#endif
  • 最终头文件如下,判断是否重复定义宏
#ifndef math.h
#define math.h

#ifdef __cplusplus
extern "C" {
#endif
    int sum(int v1, int v2);
    int delta(int v1, int v2);
#ifdef __cplusplus
}
#endif

#endif

原文地址:https://www.cnblogs.com/sec875/p/12253083.html

时间: 2024-10-10 20:51:01

被extern "C" 修饰后按照C语言编译的相关文章

C++函数重载实现的原理以及为什么在C++中调用C语言编译的函数时要加上extern &quot;C&quot;声明

C++相对于C语言而言支持函数重载是其极大的一个特点,相信在使用C语言的时候大家如果要写一个实现两个整型数据相加的函数还要写一个浮点型数据相加的函数,那么这两个函数的名字绝对不可以一样,这样无疑在我们使用这个函数的时候增加了复杂性,但是在C++中我们却可以很好的解决这个问题,因为在C++中函数是支持重载的也就是说两个函数的函数名可以一样,这样并不会出现函数名重定义的问题,但是我们在使用的时候也要遵守一些规定,这些规定我们会在接下来的讨论中提到,下面我们就来分析在C++中函数是如何实现函数的重载的

JMeter - 后处理器/脚本语言 - 比较

当我们使用JMeter / Response数据处理进行密集负载测试时,我们可能会非常小心我们选择的后处理器/脚本语言的类型.在这篇文章中,我想说明这些后处理器/脚本语言如何影响测试的整体性能. 我们将比较以下后处理器和脚本语言. BeanShell PostProcessor BSF PostProcessor - Beanshell BSF PostProcessor - Javascript BSF PostProcessor - Groovy JSR223 PostProcessor -

C语言编译全过程

原文地址:http://www.yuanma.org/data/2009/0506/article_3647.htm 编译的概念:编译程序读取源程序(字符流),对之进行词法和语法的分析,将高级语言指令转换为功能等效的汇编代码,再由汇编程序转换为机器语言,并且按照操作系统对可执行文件格式的要求链接生成可执行程序.    编译的完整过程:C源程序-->预编译处理(.c)-->编译.优化程序(.s..asm)-->汇编程序(.obj..o..a..ko)-->链接程序(.exe..elf

C语言编译全过程【转】

http://www.linuxdiyf.com/viewarticle.php?id=175655 编译的概念:编译程序读取源程序(字符流),对之进行词法和语法的分析,将高级语言指令转换为功能等效的汇编代码,再由汇编程序转换为机器语言,并且按照操作系统对可执行文件格式的要求链接生成可执行程序. 编译的完整过程:C源程序-->预编译处理(.c)-->编译.优化程序(.s..asm)-->汇编程序(.obj..o..a..ko)-->链接程序(.exe..elf..axf等) 1.

14. Go 语言编译与工具

Go 语言编译与工具 Go 语言的工具链非常丰富,从获取源码.编译.文档.测试.性能分析,到源码格式化.源码提示.重构工具等应有尽有. 在 Go 语言中可以使用测试框架编写单元测试,使用统一的命令行即可测试及输出测试报告的工作.基准测试提供可自定义的计时器和一套基准测试算法,能方便快速地分析一段代码可能存在的 CPU 耗用和内存分配问题.性能分析工具可以将程序的 CPU 耗用.内存分配.竞态问题以图形化方式展现出来. go build命令(go语言编译命令)完全攻略 Go语言的编译速度非常快.G

C语言编译出现 incompatible implicit declaration of built-in function ‘strlen’等

C语言 编译时出现错误 warning: incompatible implicit declaration of built-in function 'malloc'warning: incompatible implicit declaration of built-in function 'bzero'warning: incompatible implicit declaration of built-in function 'strncpy'warning: incompatible

Eclipse - 安装了jd-eclipse插件后依然无法反编译类文件

问题 Eclipse在安装了jd-eclipse插件后依然无法反编译类文件,这个问题是因为没有修改默认的类文件查看器. 解决方法 修改默认的类文件查看器为jd-eclipse Window -> Preference -> General -> Editors -> File Associations 选中*.class,将Class File Editor设置为默认(Default) 选中*.class without source,将Class File Editor设置为默认

static extern const修饰符

const const修饰的东西不能被修改(由左至右解读-->顺时针螺旋法则) 指针类型根据位置的不同可以理解成3种情况: 1.常量指针 NSString * const pt1; //常量指针,指向一个字符串 //pt1初始化之后不能赋值,指向的对象值可以修改. //定义字符串常量 //NSString* const [email protected]"123"; @"123"存储在文字常量区,相同的字符串只存储一份 NSString* [email pro

extern static修饰全局变量的区别

在实际开发C++项目的时候,一个项目里面往往会包含多个cpp文件,多个头文件,有时还会有c文件.由于变量的声明可以有多次,但定义只能有一次,这就不可避免地要使用extern,static关键字.弄清楚这几个关键字之间的用法和区别,能节省很多调试项目的时间,尤其是对于一些难以定位的链接错误.下面分别介绍: 一.extern关键字 这个关键字可能是最容易用错的一个,一方面可能是因为平时写的小程序不太会用到这个关键字,另一方则是这个关键字确实有些不太容易理解的用法. extern关键字主要有两个作用: