extern作用:在某个.cpp文件中存在这么一个函数/全局变量

声明外部函数

a.cpp中使用b.cpp中函数,需要在a.cpp中函数使用之前用extern修饰函数声明。

a.cpp

#include <iostream>extern double area(int num);int main()
{double r;std::cout << "Please enter radius of circle: " << std::endl;std::cin >> r;std::cout << area(r) << std::endl;return 0;
}

b.cpp

#define PI 3.1415926double area(int num) {return PI * num * num;
}

输出

Please enter radius of circle:
1
3.14159

注:a.cpp中函数声明是可以省略extern关键字的。

声明外部全局变量

a.cpp中使用b.cpp中全局变量,需要在a.cpp中变量使用之前用extern修饰变量声明。

b.cpp

int a = 10;

a.cpp

#include <iostream>extern int a;int main()
{std::cout << "a = " << a << std::endl;return 0;
}

注:a.cpp中全局变量的声明是不能加初始值的。

若是将代码改成:

extern int a = 1;

则会报错

D:\VS2019Projects\externTest\x64\Debug\externTest.exe : fatal error LNK1169: 找到一个或多个多重定义的符号

extern关键字修饰的函数或全局变量,在自己的cpp文件中定义也是可以的。

例如:main.cpp

#include <iostream>extern int a;
extern int b;
extern int sum(int num1, int num2);int a;
int b;int main()
{a = 10; b = 20;std::cout << "sum = " << sum(a, b) << std::endl;return 0;
}int sum(int num1, int num2) {return num1 + num2;
}

输出

sum = 30

关于重定义

在多个cpp中,不能定义相同名字的符号。

  1. 不能定义相同名称的全局变量

例如,a.cppb.cpp中存在相同的全局变量。

a.cpp

#include <iostream>int a;int main()
{return 0;
}

b.cpp

int a;

报错

D:\VS2019Projects\externTest\x64\Debug\externTest.exe : fatal error LNK1169: 找到一个或多个多重定义的符号
  1. 不能定义相同的函数。(函数相同:函数名+参数列表相同)

例如,a.cppb.cpp中存在相同的函数。

a.cpp

#include <iostream>int sum(int num1, int num2) {return num1 + num2;
}int main()
{return 0;
}

b.cpp

int sum(int num1, int num2) {return num1 + num2;
}

报错

D:\VS2019Projects\externTest\x64\Debug\externTest.exe : fatal error LNK1169: 找到一个或多个多重定义的符号

C++是允许函数重载的,当函数名相同,参数列表不同时,编译器不会报错。例如:

a.cpp

#include <iostream>int sum(int num1, int num2) {return num1 + num2;
}int main()
{return 0;
}

b.cpp

int sum(int num1, int num2, int num3) {return num1 + num2 + num3;
}
  1. 无定义的错误

当在一个cpp文件中声明了一个函数,并且调用它。但是在链接过程中没有发现任何一个cpp文件中定义了。例如:

只在main.cpp中声明函数sum

#include <iostream>extern int sum(int num1, int num2);int main()
{sum(10, 20);return 0;
}
error LNK2019: 无法解析的外部符号 "int __cdecl sum(int,int)" (?sum@@YAHHH@Z),函数 main 中引用了该符号

关键字extern用法相关推荐

  1. C# 关键字extern用法

    C# 关键字extern用法 修饰符用于声明在外部实现的方法.extern 修饰符的常见用法是在使用 Interop 服务调入非 托管代码时与 DllImport 属性一起使用:在这种情况下,该方法还 ...

  2. 《C关键字分析》之extern用法

    <C关键字分析>之extern用法 一.假设为三方提供库源码和头文件 1.共享库部分 sanf.c #include <stdio.h> int a; void hello() ...

  3. extern用法详解(转)

    extern用法详解(转)       1 基本解释 extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义. 另外,extern ...

  4. __declspec关键字详细用法

    __declspec关键字详细用法 2009-01-21 16:23 __declspec用于指定所给定类型的实例的与Microsoft相关的存储方式.其它的有关存储方式的修饰符如static与ext ...

  5. extern用法详解

    [转]extern用法详解 Posted on 2011-08-16 11:15 单鱼游弋 阅读(98) 评论(0)编辑收藏 1 基本解释 extern可以置于变量或者函数前,以标示变量或者函数的定义 ...

  6. 关于extern用法说明

    extern是C/C++语言中表明函数和全局变量 作用范围(可见性)的关键字. 它告诉编译器,其 声明的函数和变量可以在本模块或其它模块中使用. 1.对于extern变量来说,仅仅是一个变量的声明,其 ...

  7. C语言中static与extern用法总结

    前言-变量的储存方法 在C语言中,供用户使用的储存空间分为3个部分,程序区.静态储存区和动态储存区.其中,程序区存放的是可执行程序的机器指令,静态储存区存放的是在程序运行期间需要占用固定储存单元的变量 ...

  8. extern 用法小结

    1 基本解释 extern可以置于变量或者函数 前,以标示变量或者函数 的定义在别的文件中,提示编译器遇到此变量和函数 时在其他模块中寻找其定义. 另外,extern也可用来进行链接指定. 2 问题: ...

  9. C/C++中 extern用法

    一.定义和声明的区别 声明用来告诉编译器变量的名称和类型,而不分配内存,不赋初值. 定义为了给变量分配内存,可以为变量赋初值. 注:定义要为变量分配内存空间:而声明不需要为变量分配内存空间. 二.ex ...

最新文章

  1. 067_VFPage中Js与controller交互方式(二) RemoteAction
  2. java 模型 数据库_数据库表与java域模型之间的mapping和自动生成(基于mybatis)
  3. java代码编译时修改行为_GitHub - niuzhihua/AST_demo: 利用JavaParser框架在编译时修改语法树(源码)的 demo...
  4. 要买东西,要买好的,提高效率,经常用的
  5. js用button激活 Alert 元素关闭按钮的交互功能
  6. Centos下MySQL的安装及常见问题
  7. php 如何让html表单当中的数据在修改mysql的时候自动变更_怎么用php把html表单内容写入数据库?...
  8. python如何将数据保存到本地json文件
  9. 日志系统新贵 Loki,确实比笨重的 ELK 轻
  10. centos7重装python_centos7完全重装python和yum
  11. Swift iOS : plist
  12. linux xxx is not in the sudoers file.This incident will be reported.的解决方法
  13. 查看kms服务器信息,查看kms服务器地址
  14. [笔记分享] [GPIO] MSM8x39 GPIO 软件部分小结
  15. 考研助手软件制作记录
  16. 服务器的硬盘分盘,服务器硬盘分区教程
  17. C# 时间日期的获取与比较
  18. 常用计算机辅助审计技术,常用的计算机辅助审计技术
  19. 微软修补Windows零日漏洞,该漏洞允许在Windows计算机上远程执行
  20. Android 从应用程序跳到系统应用管理和应用的权限管理页面

热门文章

  1. 刀剑乱舞服务器维护时间,活击刀剑乱舞什么时候更新
  2. 电工基础知识(纯干货)
  3. 新能源车的火烧到了二手车市场
  4. vscode安装拓展插件报错提示请手动安装
  5. 微信小程序--翻转数组
  6. 【Mongoose笔记】SOCKS5 服务器
  7. SQL中字符截取、拼接 、转换常用方法
  8. python ipados_iPadOS13正式版下载-iPadOS13正式版描述文件下载官方版-西西软件下载...
  9. 编译安装Nginx步骤详解
  10. coreldraw2019安装教程