Why? 在C++中调用被C编译后的函数,要在声明的前面加extern "C"

在C++程序中调用被C编译器编译后的函数,为什么要在声明的前面加extern "C"?

答:c语言不支持重载,C++支持重载

为了告诉编译器这个函数是C的编译风格,所以在找这个函数的时候也要按照C的风格去找

比如:在C++中写一个add函数

int add(int n1,  int  n2)

它找到的是?[email protected]@[email protected]

?函数名@@YA参数参数返回值@Z

H代表int  M代表float

@@YA表示开始      @Z表示结束

在C语言中写一个add函数

int add(int n1,  int  n2)

它找到的是_add

时间: 2024-10-10 19:57:28

Why? 在C++中调用被C编译后的函数,要在声明的前面加extern "C"的相关文章

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

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

如何在Windows命令行(DOS界面)中调用 编译器 来编译C/C++源程序

首先说明一下背景: 为什么要在DOS界面编译C/C++源程序?有很多现成的开发环境(IDE)如:vs, vc++等,这些开发环境集成了编译,调试,使用起来很方便,而且图形化操作界面,简洁明了.但是在开发环境中编译程序,需要建立一个工程,当我只需要编译单个小的测试文件时,比喻 输出helloword!这样的单个小文件,在IDE中编译,仍然需要建立一个工程,这有点麻烦:所以在DOS界面中调用编译器来编译一个单独的C/C++文件,就显得很方便了: 如何在DOS界面中调用 编译器 来编译C/C++源程序

boost在lambda表达式中调用占位符参数的成员函数的方法

boost中提供了lambda表达式的用法,但是lambda表达式的功能还不是很强大,在其中只能对lambda的占位符参数_1等使用最基本的操作符,如+-*/,可是很多时候如果传入的占位符参数是一个对象指针的话,我们可能想要调用这个类的成员函数. 我在开发中遇到了这个问题,需要在stl的算法中传入一个函数来调用对象的比较函数,因为感觉这样太麻烦,还需要重新定义一个函数,所以想起了lambda表达式,c++11的lambda表达式我倒是没试过,可是受项目开发环境所限,只能选择boost.但是我用的

Oracle数据库中调用Java类开发存储过程、函数的方法

Oracle数据库中调用Java类开发存储过程.函数的方法 时间:2014年12月24日  浏览:5538次 oracle数据库的开发非常灵活,不仅支持最基本的SQL,而且还提供了独有的PL/SQL,除此之外,还可以用时下最流行的编程语言Java来做开发.随着对oracle的了解越来越多,越来越禁不住oracle的诱惑,oracle技术真的是一门很有趣的学问.之前,我在博客中总结了挺多有关SQL.PL/SQL的,但是对于oracle数据库中Java类的调用却没有总结,也是因为之前不太会,这会儿总

在平台中调用网格部件.DeleteFocusedRow()后在循环访问网格部件.DataTabel时报错

'访问DataTable时提示:已删除行不能访问for each dr in 网格部件1.DataTable.Rows       if isnull(dr["ID"]) then        ShowInformation("ID不能为空")        end    end if   next 如上图所示这样的循环判断,如果在对网格部件1的数据进行过删除操作,也就是调用过:网格部件.DeleteFocusedRow()这样的方法,那么会引发错误:已删除的上不

C#中调用user32.dll库的keybd_Event函数,操作键盘

keybd_event()的函数原型是: void keybd_event( byte bVk,          //虚拟键码 byte bScan,       //该键的硬件扫描码 dword dwFlags   //函数操作的各个方面的一个标志位集 dword dwExtraInfo  //与击键相关的附加的32位值 ); 其中第三个参数有三种取值: · 0:按下 · 1:扩展键 · 2:弹起 keybd_event(0x41, 0x1e, 0x0000, 0); // 按下 a key

转 如何在C++中调用C程序

如何在C++中调用C程序? C++和C是两种完全不同的编译链接处理方式,如果直接在C++里面调用C函数,会找不到函数体,报链接错误.要解决这个问题,就要在 C++文件里面显示声明一下哪些函数是C写的,要用C的方式来处理.1.引用头文件前需要加上 extern “C”,如果引用多个,那么就如下所示extern “C”{#include “ s.h”#include “t.h”#include “g.h”#include “j.h”};然后在调用这些函数之前,需要将函数也全部声明一遍.2.C++调用

重载函数编译后的新名字

我们都知道很多语言都支持函数重载,那么编译器是怎么处理编译后它们的命名冲突的呢? 1.先给出几个正确的重载函数: #include <iostream> using namespace std; int Add(int a, int b) { return a + b; } double Add(double a, double b) { return a + b; } double Add(double a, int b) { return a + b; } double Add(int a

嵌入Python | 调用Python模块中有参数的函数

开发环境Python版本:3.6.4 (32-bit)编辑器:Visual Studio CodeC++环境:Visual Studio 2013 需求说明前一篇<在C++中嵌入Python|调用无参数的函数>中我们成功的在C++主程序中嵌入了Python,并且调用了Python模块中的一个无参数的函数.这一篇我们将在此基础上,实现在主程序中调用Python模块中有参数的函数,使两者互动起来. 0 准备say_hi.py模块 在say_hi.py中增加含有一个参数的函数prt_hello和含有