1、extern用在变量或者函数的声明前,用来说明“此变量/函数是在别处定义的,要在此处引用”。extern声明不是定义,即不分配存储空间。也就是说,在一个文件中定义了变量和函数, 在其他文件中要使用它们, 可以有两种方式:使用头文件,然后声明它们,然后其他文件去包含头文件;在其他文件中直接extern。

2、extern C作用

链接指示符extern C
    如果程序员希望调用其他程序设计语言尤其是C 写的函数,那么调用函数时必须告诉编译器使用不同的要求,例如当这样的函数被调用时函数名或参数排列的顺序可能不同,无论是C++函数调用它还是用其他语言写的函数调用它,程序员用链接指示符告诉编译器该函数是用其他的程序设计语言编写的,链接指示符有两种形式既可以是单一语句形式也可以是复合语句形式。
// 单一语句形式的链接指示符
extern "C" void exit(int);
// 复合语句形式的链接指示符
extern "C" {
int printf( const char* ... );
int scanf( const char* ... );
}
// 复合语句形式的链接指示符
extern "C" {
#include <cmath>
}
    链接指示符的第一种形式由关键字extern 后跟一个字符串常量以及一个普通的函数,声明构成虽然函数是用另外一种语言编写的但调用它仍然需要类型检查例如编译器会检查传递给函数exit()的实参的类型是否是int 或者能够隐式地转换成int 型,多个函数声明可以用花括号包含在链接指示符复合语句中,这是链接指示符的第二种形式花扩号被用作分割符表示链接指示符应用在哪些声明上在其他意义上该花括号被忽略,所以在花括号中声明的函数名对外是可见的就好像函数是在复合语句外声明的一样,例如在前面的例子中复合语句extern "C"表示函数printf()和scanf()是在C 语言中写的,函数因此这个声明的意义就如同printf()和scanf()是在extern "C"复合语句外面声明的一样,当复合语句链接指示符的括号中含有#include 时,在头文件中的函数声明都被假定是用链接指示符的程序设计语言所写的,在前面的例子中在头文件<cmath>中声明的函数都是C函数链接指示符不能出现在函数体中下列代码段将会导致编译错误。
int main()
{
// 错误: 链接指示符不能出现在函数内
extern "C" double sqrt( double );
305 第七章函数
double getValue(); //ok
double result = sqrt ( getValue() );
//...
return 0;
}
如果把链接指示符移到函数体外程序编译将无错误
extern "C" double sqrt( double );
int main()
{
double getValue(); //ok
double result = sqrt ( getValue() );
//...
return 0;
}
    但是把链接指示符放在头文件中更合适,在那里函数声明描述了函数的接口所属,如果我们希望C++函数能够为C 程序所用又该怎么办呢我们也可以使用extern "C"链接指示符来使C++函数为C 程序可用例如。
// 函数calc() 可以被C 程序调用
extern "C" double calc( double dparm ) { /* ... */ }
    如果一个函数在同一文件中不只被声明一次则链接指示符可以出现在每个声明中它,也可以只出现在函数的第一次声明中,在这种情况下第二个及以后的声明都接受第一个声明中链接指示符指定的链接规则例如
// ---- myMath.h ----
extern "C" double calc( double );
// ---- myMath.C ----
// 在Math.h 中的calc() 的声明
#include "myMath.h"
// 定义了extern "C" calc() 函数
// calc() 可以从C 程序中被调用
double calc( double dparm ) { // ...
    在本节中我们只看到为C 语言提供的链接指示extern "C",extern "C"是惟一被保证由所有C++实现都支持的,每个编译器实现都可以为其环境下常用的语言提供其他链接指示例如extern "Ada"可以用来声明是用Ada 语言写的函数,extern "FORTRAN"用来声明是用FORTRAN 语言写的函数,等等因为其他的链接指示随着具体实现的不同而不同所以建议读者查看编译器的用户指南以获得其他链接指示符的进一步信息。

总结 extern “C”

extern “C” 不但具有传统的声明外部变量的功能,还具有告知C++链接器使用C函数规范来链接的功能。 还具有告知C++编译器使用C规范来命名的功能。

extern关键字作用相关推荐

  1. static,extern关键字作用?

    1.static: static修饰全局变量和类变量:定义内部函数 2.extern: extern(外面的) 声明外部变量和外部函数,声明的变量和函数可能不在本文件内定义或实现,调用的时候也要重新声 ...

  2. 【C语言】20-static和extern关键字2-对变量的作用

    说明:这个C语言专题,是学习iOS开发的前奏.也为了让有面向对象语言开发经验的程序员,能够快速上手C语言.如果你还没有编程经验,或者对C语言.iOS开发不感兴趣,请忽略 上一讲介绍了static和ex ...

  3. c 函数多次声明_【C语言】- static和extern关键字 - 对函数的作用!

    不同类型的变量有不同的存储类型.不同的生命周期.不同的作用域.这篇小文介绍2个比较重要的关键字:static和extern. static和extern不仅可以用在变量上,还可以用在函数上.这讲先介绍 ...

  4. java extern的作用_学习笔记之20-static和extern关键字2-对变量的作用

    上一讲介绍了static和extern对函数的作用,static用来定义一个内部函数,不允许其他文件访问:extern用来定义和声明一个外部函数,允许其他文件访问.static和extern对变量也有 ...

  5. c语言extern_【零基础C语言】- static和extern关键字 - 对变量的作用!

    上一篇文章介绍了static和extern对函数的作用,static用来定义一个内部函数,不允许其他文件访问:extern用来定义和声明一个外部函数,允许其他文件访问.static和extern对变量 ...

  6. extern 关键字的作用

    extern关键字一般放置于变量或函数前,用于标示变量或函数的定义在别的文件中.当编译器遇到此变量和函数时在其他模块中寻找其定义. 1. 当出现extern "C"的时候: 主要作 ...

  7. C语言extern关键字的作用

    1.引用同一个文件中的变量 #include<stdio.h>int func();int main() {func(); //1printf("%d",num); / ...

  8. c语言关键字extern作用,C语言中extern关键字详解

    <C语言中extern关键字详解>由会员分享,可在线阅读,更多相关<C语言中extern关键字详解(5页珍藏版)>请在人人文库网上搜索. 1.C 语言中 extern 关键字详 ...

  9. c语言关键字extern作用,c语言extern关键字详解

    标签: 在c语言中代码的执行顺序是从上往下执行的,如果定义的函数或者变量在调用之后,那么调用的时候编译就会找不到需要使用的变量.这样就会出现错误,如下代码: #include int main(){ ...

  10. C++ 笔记(05)— 变量(变量定义、声明、初始化、extern关键字、变量之间转换)

    1. 变量定义 变量定义就是告诉编译器在何处创建变量的存储,以及如何创建变量的存储.变量定义指定一个数据类型,并包含了该类型的一个或多个变量的列表,如下所示: type variable_list; ...

最新文章

  1. 一种不会导致资源泄露的“终止”线程的方法
  2. RStudio中为R创建Notebook文件
  3. 表格全屏显示_2020-2026年中国手机显示屏市场现状研究分析与发展前景预测报告...
  4. redistemplate set方法_spring boot整合redis ---- RedisTemplate 三分钟快速入门
  5. java语言50到100之间素数和_用JAVA语言编写一程序,求100以内的所有素数
  6. vba excel 退出编辑状态_偷梁换柱之EXCEL编辑保护和VBA隐藏代码保护的解锁
  7. 软件工程六大设计原则总结,案例演示
  8. hive join on 条件 与 where 条件区别
  9. WinAPI: 钩子回调函数之 CallWndProcRetProc
  10. 使用windbg通过vtable找到优化后的this指针
  11. python 3 导入 迭代判断
  12. NERO9注册机使用
  13. (22) 基于动态时空图卷积神经网络的交通流预测
  14. win10 UEFI引导恢复
  15. 网页弹出窗口代码全攻略
  16. 王慧文清华产品课(一)
  17. greenplum单机版初始化日志
  18. Python数据爬虫学习笔记(10)淘宝图片爬虫实战
  19. linux交叉编译openssl,交叉编译openssl for linux arm-v5te-linux-gnueabi工具链
  20. win10环境变量设置(win10系统环境变量怎么设置)

热门文章

  1. qq接收不了文件显示服务器拒绝,QQ提示服务器拒绝了您发送离线文件怎么办
  2. 电脑里的所有播放器只能播放声音没有画面
  3. uclinux 与 linux的区别
  4. 2012云计算发展趋势
  5. 利用selenium自动登录126邮箱
  6. 第一次QMK编译记录(11.26)
  7. git init报错Reinitialized existing Git repository
  8. python循环速度提高_提高python中for循环的速度
  9. 如何区分精确率(precision)、准确率(accuracy)和召回率(recall)
  10. 热点讨论:IT人,40岁以后能干什么?