C++函数重载机制及为什么要加extern C
来源:互联网 发布:留学cv 知乎 编辑:程序博客网 时间:2024/06/07 05:26
C++程序调用被C编译后的程序为什么要加extern C?
因为C++和C是两种完全不同的编译链接处理方式,所以如果直接在C++里面调用C函数,这样链接起来是通不过的,会报链接错误,找不到函数体,所以要在 C++文件里面显示声明以下一些函数是C写的,要用C的方式来处理,这个在C++设计初期就考虑到兼容性的问题,所以是可以解决的。
比如用C写了 A.h和A.c这两个文件,里面包括了void A_app(int)这样的函数,那么在需要调用这个函数的CPP文件里面,就需要显示声明一下了。
1.引用头文件前需要加上 extern “C”,如果引用多个,那么就如下所示
extern “C”
{
#include “B.h”
#include “C.h”
#include “D.h”
};
然后在调用这些函数之前,需要将函数也全部声明一遍。
2.C++调用C函数的方法,将用到的函数全部重新声明一遍
extern “C”
{
extern void A_app(int);
extern void B_app(int);
extern void C_app(int);
extern void D_app(int);
}
C++程序中调用被c编译器编译后的函数,为什么要加extern “C”?
C++语言支持函数重载,C语言不支持函数重载。函数被C++编译后在库中的名字与C语言的不同。
假设某个C 函数的声明如下:
void foo(int x, int y);
该函数被C 编译器编译后在库中的名字为_foo,而C++编译器则会产生像_foo_int_int之类的名字用来支持函数重载和类型安全连接。由于编译后的名字不同,C++程序不能直接调用C 函数。C++提供了一个C 连接交换指定符号extern“C”来解决这个问题。
例如:
extern “C”
{
void foo(int x, int y);
// 其它函数
}
或者写成
extern “C”
{
// 其它C 头文件
}
这就告诉C++编译译器,函数 foo 是个C 连接,应该到库中找名字_foo 而不是找
_foo_int_int。C++编译器开发商已经对C 标准库的头文件作了extern“C”处理,所以
我们可以用#include 直接引用这些头文件
C++函数重载的实现机制
阅读全文
1 0
- C++函数重载机制及为什么要加extern C
- C++调用C函数,为什么要加extern "C"?
- C++调用C函数,为什么要加extern "C"?
- c调用c++函数,为什么要加extern c
- extern "C" 与函数重载机制
- 【c++面试题】c++中函数的重载,c++程序中调用C编译器编译后的函数为什么要加extern "C"
- 在C++中调用被C编译器编译后的函数,为什么要加extern "C"
- 为什么在C++里调用被C编译器编译的函数,要加extern "c"
- c++程序调用被C编译器编译后的函数为什么要加extern "C"
- 函数重载与Extern "C"
- 在C++ 程序中调用被 C 编译器编译后的函数,为什么要加 extern
- 在C++ 程序中调用被C 编译器编译后的函数,为什么要加extern “C”?
- 在C++ 程序中调用被C 编译器编译后的函数,为什么要加extern “C”?
- 经典面试题目--在C++ 程序中调用被C 编译器编译后的函数,为什么要加extern “C”?
- 在C++ 程序中调用被 C编译器编译后的函数,为什么要加 extern “C”声明?
- 在C++ 程序中调用被C 编译器编译后的函数,为什么要加extern “C”?
- 在C++ 程序中调用被 C编译器编译后的函数,为什么要加 extern “C”声明?
- 在C++ 程序中调用被C 编译器编译后的函数,为什么要加extern “C”?
- js基础
- cf_438_B
- Andrew-Coursera-DL课程-笔记part1-2(Shallow neural networks)
- codeforces 467B
- hadoop-企业版环境搭建(一)-环境搭建和hadoop基本配置
- C++函数重载机制及为什么要加extern C
- 设计模式-桥接模式
- Win7 + Vmware12 + Centos6.9 局域网环境NAT方式联网 附带 MySQL5.7安装
- Java实现二叉树
- 解决eclipse无法识别从svn中导出的项目的问题
- 最长上升子序列
- JDBC学习笔记—增删改查
- webpack postcss-loader autoprefixer 配置
- MATLAB2016b vs2017 mbuild -setup 未找到支持的编译器或 SDK Unable to complete successfully.