多个cpp文件协同工作。使用外部函数、变量时,必须先声明再使用
声明外部函数(一般在main.cpp中),extern可省略(主函数中默认可访问外部函数)
extern void RectArea();
声明外部全局变量(一般在非main.cpp中),extern不可省略,不能初始化。
extern double length, width;
extern double totalArea;

  1. #include<iostream>
  2. using namespace std;
  3. //使用外部函数,需先声明再使用
  4. //此两行代码,可以放到头文件area.h中,在本文件添加#include "area.h"
  5. void RectArea();//声明函数,供main调用
  6. double CircleArea(double r);
  7.  
  8. double length, width;//全局变量,可被其他文件识别
  9. double totalArea = ;//全局变量
  10.  
  11. int main() {//主函数,被调函数定义在主调函数之前,声明省略
  12. double r1, r2;
  13.  
  14. cout << "请输入长方形的长、宽(m)" << endl;
  15. cin >> length >> width;
  16. cout << "请输入清水池和污水池的半径(m)" << endl;
  17. cin >> r1 >> r2;
  18.  
  19. RectArea();
  20. totalArea += CircleArea(r1);
  21. totalArea += CircleArea(r2);
  22.  
  23. cout << "工程总面积为" << totalArea << "平方米" << endl;
  24. return ;
  25. }
  1. //外部变量,先声明,再使用
  2. //此两行可以放到头文件main.h中,在本文件中添加 #include "main.h"
  3. extern double length, width;//声明外部全局变量,存储main函数中的值
  4. extern double totalArea;
  5. void RectArea() {//函数,长方形面积
  6. double area = length*width;
  7. totalArea += area;
  8. }
  1. double CircleArea(double r) {//函数,圆面积
  2. return( * 3.14*r);
  3. }

源程序文件中的函数、全局变量,默认都可被其他文件访问(需声明)。
只供文件内使用,可定义成静态static,即静态函数、静态全局变量。(其他文件,即便声明,也无法使用)

静态变量,存储在静态存储区,立即分配内存,调用后存储最新的值,全部程序执行结束,才被释放。
非静态变量,存储在动态存储区(栈),被调用时分配内存,调用结束立即释放,不存储最新值。
非静态变量,不断重复“分配内存/释放”操作,每次重新开始。

  1. #include<iostream>
  2. using namespace std;
  3.  
  4. void fun() {
  5. int x = ;//每次调用执行“分配内存/释放”操作,不存储最新值,每次重新开始
  6. static int y = ;//存储最新值,全部程序结束才释放
  7. x++; y++;
  8. cout << x << " " << y << endl;
  9. }
  10. int main() {
  11. fun();//1 1
  12. fun();//1 2
  13. return ;
  14. }

若声明过多,可以使用头文件,避免繁琐。

  1. //main.h
  2. extern double length, width;//声明外部全局变量,存储main函数中的值
  3. extern double totalArea;
  1. //area.h
  2. void RectArea();//声明函数,供main调用
  3. double CircleArea(double r);
  1. #include<iostream>
  2. #include "area.h"//引入头文件,使得本文件可访问规定的函数文件
  3. using namespace std;
  4.  
  5. double length, width;//全局变量,可被其他文件识别
  6. double totalArea = ;//全局变量
  7.  
  8. int main() {//主函数,被调函数定义在主调函数之前,声明省略
  9. double r1, r2;
  10.  
  11. cout << "请输入长方形的长、宽(m)" << endl;
  12. cin >> length >> width;
  13. cout << "请输入清水池和污水池的半径(m)" << endl;
  14. cin >> r1 >> r2;
  15.  
  16. RectArea();
  17. totalArea += CircleArea(r1);
  18. totalArea += CircleArea(r2);
  19.  
  20. cout << "工程总面积为" << totalArea << "平方米" << endl;
  21. return ;
  22. } 
  1. #include "main.h"//引入头文件,使得本文件可访问规定的变量
  2. void RectArea() {//函数,长方形面积
  3. double area = length*width;
  4. totalArea += area;
  5. }
  1. double CircleArea(double r) {//函数,圆面积
  2. return( * 3.14*r);
  3. }

多文件协作,extern、static、头文件的更多相关文章

  1. extern与头文件(*.h)的区别和联系

    原文网址为:http://lpy999.blog.163.com/blog/static/117372061201182051413310/ 个人认为有一些道理:所以转过来学习了. 用#include ...

  2. [转]extern与头文件(*.h)的区别和联系

    用#include可以包含其他头文件中变量.函数的声明,为什么还要extern关键字? 如果我想引用一个全局变量或函数a,我只要直接在源文件中包含#include<xxx.h> (xxx. ...

  3. .c和.h文件的区别(头文件与之实现文件的的关系~ )

     .c和.h文件的区别 一个简单的问题:.c和.h文件的区别 学了几个月的C语言,反而觉得越来越不懂了.同样是子程序,可以定义在.c文件中,也可以定义在.h文件中,那这两个文件到底在用法上有什么区别呢 ...

  4. 利用 Symbol Type Viewer 工具实现将 pdb 文件 转换为 c\c++ 头文件

    利用 Symbol Type Viewer 工具实现将 pdb 文件 转换为 c\c++ 头文件 一.得到符号 二.将符号转换为 .h 文件 三.得到 c\c++ 头文件,之后编程时直接导入这个文件即 ...

  5. linux设备驱动程序该添加哪些头文件以及驱动常用头文件介绍(转)

    原文链接:http://blog.chinaunix.net/uid-22609852-id-3506475.html 驱动常用头文件介绍 #include <linux/***.h> 是 ...

  6. C++ 多文件编译简述:头文件、链接性、声明与定义

    目录 Commen Sense 头文件 链接性 static 与链接性控制 extern 与外部链接性 Reference Commen Sense C++ 在编译时对每个翻译单元(Translati ...

  7. 一个简单的wed服务器SHTTPD(9)————main函数文件,Makefile,头文件

    主函数: #include "lcw_shttpd.h" //初始化时服务器的默认配置 extern struct conf_opts conf_para= { "/us ...

  8. C/C++不同文件夹下包含头文件的方法及#include的使用

    转自:http://blog.sina.com.cn/s/blog_6e0693f70100so42.html 本文主要介绍了如何不同文件夹下使用预处理器指示符#include. 假设我们有如下一个工 ...

  9. 文件类型分类:头文件dirent.h中定义的文件类型与linux内文件符号对应关系

    头文件 dirent.h 定义了文件类型: enum{    DT_UNKNOWN = 0,         //未知类型    DT_FIFO = 1,            //first in, ...

  10. 删除moduleCache下文件解决预编译头文件相关的编译错误

    之前有在代码全部正确的情况下,遇到过下面的编译错误: fatal error: file '.....h' has been modified since the precompiled header ...

随机推荐

  1. vscode git设置远程仓库码云

    https://www.cnblogs.com/klsw/p/9080041.html

  2. MVP, MVC, MVVM, 傻傻分不清楚~

    1 简介 英文原文:MVC vs. MVP vs. MVVM 三者的目的都是分离关注,使得UI更容易变换(从Winform变为Webform),使得UI更容易进行单元测试. 2 MVC/MVP 2.1 ...

  3. josn的格式化

    public String formatJson(Object obj) { com.alibaba.fastjson.JSONObject json=(com.alibaba.fastjson.JS ...

  4. 12.k8s的存储卷创建过程

    数据持久化需要数据卷.kubernetes生态提供海量的存储驱动和存储使用方式. [root@master song]# cat pod-demo.yml apiVersion: v1 kind: P ...

  5. BizTalk Server 如何处理大消息

    什么是大消息? 遗憾的是,此问题的答案不而直接与特定的消息大小,绑定,取决于你的 Microsoft 的特定瓶颈 BizTalk Server 系统. 与大消息关联的问题可分为以下几类: 内存不足错误 ...

  6. MySQL的my.cnf文件(解决5.7.18下没有my-default.cnf)

    官网说:从5.7.18开始不在二进制包中提供my-default.cnf文件.参考:https://dev.mysql.com/doc/refman/5.7/en/binary-installatio ...

  7. Python测试Post请求

    原有: #coding:utf-8 import requests def request(title, content): datas = {"title":title,&quo ...

  8. Number Sequence POJ - 1019 递推 数学

    题意 1 12 123 1234 12345 ....这样的序列 问第n位数字是几   是数字! 1-9! 思路:递推关系 主要是位数的计算   用a[i]=a[i-1]+(int)log10((do ...

  9. Nowcoder | [题解-N189]牛客OI赛制测试赛3

    这场说实话确实水(逃*1),表示差一点就AK了(逃*2),然而被卡两个特判的我\(ssfd\)...\(qwq\) 表示这是第一次发整场比赛的题解...还请各位大佬原谅我太蒻写的垃圾啊\(qwq\). ...

  10. SAM练习记录

    SAM练习记录 洛谷 P1368 工艺 其实是最小表示法裸题 倍长后建SAM跑最小的边走|S|步即可 Code CF 235 C. Cyclical Quest 对主串建SAM 然后每个串倍长,跑的时 ...