extern关键字及C\C++相互调用
extern关键字主要修饰变量或函数,表示该函数可以跨文件访问,或者表明该变量在其他文件定义,在此处引用。
1.extern修饰变量
(1)如果某变量int m在a.c中定义声明,则其他b.c文件访问时,需要用extern声明该变量才可以。
注意extern的严格声明,如在一个文件中声明char a[] = "abcd";另一个文件如果访问需声明extern char a[],而不能是extern char *a;
(2)如果在*.h中声明,其他文件使用时,则只需要包含头文件即可,无需再声明,建议只在头文件中声明就好了。
注意:extern可以声明无数次,但只能定义一次,否则会出现链接错误。另外能够被其他模块以extern修饰符引用到的变量通常是全局变量,extern int m可以放在b.c中的任何地方,如果放在代码块内,则b.c中访问m的区域就只能限于代码块内。
(3)如果一个变量声明于代码块内部,在它前面添加extern表示引用的是全局变量而不是局部变量。
2.extern修饰函数(不用"C"修饰)
extern修饰函数和变量没有区别,只需extern声明后,即可用于该文件中各个位置。对其他模块中函数的引用,最常用的方法是包含这些函数声明的头文件,在程序中取代include “*.h”来声明函数。
一般调用方式如下:首先在头文件extern 修饰声明函数,包含该头文件在对应的c文件中实现该函数,C语言中其他文件使用时可以直接调用,也可用extern声明该函数后使用,但C++必须声明后才能使用。建议声明后使用。
使用extern和包含头文件来引用函数有什么区别呢?
extern的引用方式比包含头文件要简洁得多!extern的使用方法是直接了当的,想引用哪个函数就用extern声明哪个函数。这样做的一个明显的好处是,会加速程序的编译(确切的说是预处理)的过程,节省时间。在大型C程序编译过程中,这种差异是非常明显的。
3.extern用于C\C++相互调用
extern修饰函数时可以添加"C",从而实现C\C++相互调用。
(1)C调用C++
C++头文件中函数前用extern "C"修饰声明,在对应的cpp文件中实现该函数时需注意函数接口不能使用vector或string等C++专有特性,否则C中无法使用
一般调用方式如下:首先在C++头文件extern "C"修饰声明函数,包含该头文件在对应的cpp文件中实现该函数,使用时可以和普通extern声明函数一样使用,在C语言中,只能指定为extern类型,C语言中不支持extern"C"声明。
(2)C++调用C
C++语言在编译的时候为了解决函数的多态问题,会将函数名和参数联合起来生成一个中间的函数名称,而C语言则不会,因此会造成链接时找不到对应函数的情况,此时C函数就需要用extern “C”进行链接指定,这告诉编译器,请保持我的名称,不要生成用于链接的中间函数名。
一般调用格式有两种,第一种在c语言头文件中用extern"C"声明:
exte.h
#ifdef __cplusplus
extern "C" {
#endif void mytest(); #ifdef __cplusplus
}
#endif
exte.c
#include "exte.h"
#include <stdio.h>
void mytest(){ printf("%s", "mytest");
}
main.cpp
#include<iostream>
//#include "exte.h"
extern "C" void mytest();//和上面的语句二选一即可,如果函数太多,一般用上面包含头文件的方法
int main(){ mytest();
system("pause");
return ;
}
第二种是在cpp文件调用时,通过extern"C"包含C语言头文件
exte.h
void mytest();
exte.c
void mytest(){
printf("%s", "mytest");
}
main.cpp
#include<iostream>
extern "C"{ //和下面的语句二选一即可
#include "exte.h"
}
//extern "C" void mytest();
int main(){
mytest();
system("pause");
return ;
}
其中第二种,可以去掉include头文件,调用时extern "C" void mytest();即可。
综上,可以在头文件中声明,也可以调用时声明。至于是否需要头文件,根据实际需要决定。
extern关键字及C\C++相互调用的更多相关文章
- C语言学习及应用笔记之六:C语言extern关键字及其使用
在C语言中,修饰符extern用在变量或者函数的声明前,用来以标识变量或者函数的定义在别的文件中,提示编译器遇到此变量或者函数时,在其它文件中寻找其定义.extern关键字的用法有几种,我们下面对其进 ...
- 关于全局变量和函数,在其他类中调用问题,extern关键字
1个工程下有几个类文件,和1个全局的文件comm.h, comm.h中存放了这几个类同时需要的变量和同时调用的函数. 当时,我只在comm.h中定义: int commData1: vector&l ...
- C++基础学习笔记----第四课(函数的重载、C和C++的相互调用)
本节主要讲了函数重载的主要概念以及使用方法,还有C和C++的相互调用的准则和具体的工程中的使用技巧. 函数重载 1.基本概念 函数重载就是用同一个函数名来定义不同的函数.使用不同的函数参数来搭配同一个 ...
- C和C++相互调用
在项目中融合C和C++有时是不可避免的,在调用对方的功能函数的时候,或许会出现这样那样的问题.近来在主程序是C语言,而调用C++功能函数的时候,C++的*.h头文件都能找到,功能函数也都定义了,最重要 ...
- Python实例浅谈之三Python与C/C++相互调用
一.问题 Python模块和C/C++的动态库间相互调用在实际的应用中会有所涉及,在此作一总结. 二.Python调用C/C++ 1.Python调用C动态链接库 Python调用C库比较简单,不经过 ...
- Android JNI学习(三)——Java与Native相互调用
本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Nati ...
- 第9课 函数重载分析(下)与C、C++相互调用
重载与指针 下面的函数指针将保存哪个函数的地址: 在给p赋值的时候,我们使用了func,但是这里并没有指明参数,编译器是怎么知道这个func函数指的是第一个func函数呢? 函数重载遇上指针: 将重载 ...
- C语言与汇编语言相互调用原理以及实例
C语言与汇编语言相互调用原理以及实例 1.原理 其实不管是C语言还是汇编语言想要执行都是最终编译链接成为二进制文件. 这里一定要明确编译和链接是两个步骤,生成的文件格式也是不一样的. 编译生成的文件是 ...
- C&C++——C函数与C++函数相互调用问题
C C++相互调用 在项目中融合C和C++有时是不可避免的,在调用对方的功能函数的时候,或许会出现这样那样的问题,但只要我的C代码和我的C++代码分别都能成功编译,那其他就不是问题.近来在主程序是C语 ...
随机推荐
- php设置时区和strtotime转化为时间戳函数
date_default_timezone_set('PRC');//设置中华人民共和国标准时间 strtotime — 将任何英文文本的日期时间描述解析为 Unix 时间戳 格式:int strto ...
- TopCoder代码格式模板
$BEGINCUT$ $PROBLEMDESC$ $ENDCUT$ #include<bits/stdc++.h> using namespace std; class $CLASSNAM ...
- 在Rancher2中部署Docker-Registry仓库服务
1.docker登陆认证 [root@master ~]# vim /etc/docker/daemon.json { "insecure-registries": [" ...
- Vue+Iview+Node 搭建数据模拟接口
1.初始化node 项目 2.安装需要部件 3.编写简单代码 routers=>:index.js login.js users.js 根目录 index.js var express=re ...
- Unity3D Input 键盘控制
function Update (){ //Input.GetKey ("down") == Input.GetKey(KeyCode.DownArrow) if (Input.G ...
- JS 变量的数据类型 运算符
JS中变量的类型有:数值型.字符型.布尔型.undefined.null.array.object.function 1.数值型:可以进行算术运算的(加.减.乘.除) 数值型包括:整型(整数)和浮点型 ...
- django零散知识点
后端将对象以对象形式传到前端: from django.core.serializers import serialize def xxx(reqeust): project_list = model ...
- <小知识>记录
lis = [2,3,"k",["qwe",20,["k1",["tt",3,"1"]],89],& ...
- Easy Excel导出
@GetMapping(value = "/down2") public void down2(HttpServletResponse response) throws Excep ...
- Python全栈开发:Ajax全套
概述 对于WEB应用程序:用户浏览器发送请求,服务器接收并处理请求,然后返回结果,往往返回就是字符串(HTML),浏览器将字符串(HTML)渲染并显示浏览器上. 1.传统的Web应用 一个简单操作需要 ...