c++多文件结构 & 程序编译后出现的文件

【context】

一、通常一个项目至少划分3个文件

<1>决定一个声明放在源文件还是头文件中的一般原则:

<2>外部变量与外部函数 

二、程序编译后会出现的文件


一、通常一个项目至少划分3个文件

  • 类定义文件(*.h)——类/函数的声明(head部分)
  • 类实现文件(*.cpp,其它函数文件)——类的成员函数/函数的定义(body部分)
  • 类的使用文件(*.cpp,主函数文件main())——主函数的实现

<1>决定一个声明放在源文件还是头文件中的一般原则:

  • 将所需要分配空间的定义放在源文件(*.cpp)中,例如:函数的定义即函数的body部分(需要对函数代码分配空间)、文件作用域中的变量的定义(需要为变量分配空间)等;
  • 不需要分配空间的声明放在头文件中(*.h),例如:类声明、外部函数的原型声明、外部变量的声明、基本数据类型常量的声明等;
  • 内联函数的定义需要出现在头文件中(*.h),内联函数的内容需要嵌入每一个调用它的函数之中,而对于需要被多个编译单元调用的内联函数,它们的代码应该被各个编译单元可见。

【注】如果误将分配了空间的定义写入头文件中,在多个源文件包含该头文件时,就会导致空间在不同的编译单元中被分配多次,从而在linking时引发error。 

<2>外部变量与外部函数 

  1. 外部变量
      ——除了在定义该变量的源文件(*.cpp)中使用外,还可以被其他文件使用,则该变量即为外部变量。
      文件作用域中定义的变量,默认情况下都是外部变量,但在其它文件中如果需要使用该变量,需要用extern关键字加以声明。
      对外部变量的声明可以是定义性声明,即在声明的同时定义(分配内存,初始化),也可以是引用性声明(引用在别处已经定义好的变量)
      在文件作用域中,不用extern关键字声明的变量都是定义性声明;
      用extern关键字声明的变量:①同时指定了初值,是定义性声明;②未初始化,是引用性声明。
      外部变量可以有多处声明,但对变量的定义性声明只能是唯一的。
      外部变量可以为多个源文件所共享的全局变量。
  2. 外部函数  
      所有类之外声明的函数(非成员函数)或其他函数,都是具有文件作用域的,要想使这样的函数在不同的编译单元被调用,就要在调用之前加上引用性声明(声明函数原型)。声明或定义时也可以加extern修饰,其效果与不加时的默认状态是相同的。
      通常情况下,变量和函数(body部分)的定义<需要分配内存单元>都放在源文件(*.cpp),而对外部变量和外部函数的引用性声明<不需要分配内存单元>则放在头文件(*.h)中
  3. 变量与函数不暴露给其他编译单元
    (与extern作用相反的关键字——static
    ①用static修饰的变量和函数不会被其他编译单元引用;
    ②使用匿名命名空间也不会将其中的变量和函数暴露给其他编译单元。

举例说明

【题目】在一个文件中定义一个全局变量n,主函数main(),在另一个文件中定义函数fn1(),在main()函数中对n赋值,再调用fn1(),在fn1()中也对n赋值,显示n最后的值

文件说明

5_17(1).cpp main函数所在的文件,输出n;
5.17(2).cpp fn1()函数所在文件,对n进行赋值。
//源文件1  5_17(1).cpp
#include <iostream>
using namespace std;
extern void fn1();   //对外部定义的函数的声明

int n;  //全局变量n存储在静态存储区,占据固定的存储单元,在程序结束后释放

void test()
{
	cout << "====调用test中、调用fn1中=====" << endl;
	fn1();
	cout << "====调用test中、调用fn1后=====" << endl;
	cout << n << endl;
}
int  main()
{
	n = 10;
	cout << "====未调用test前=====" << endl;
	cout << n << endl;
	test();
	cout << "====调用test后、调用fn1后=====" << endl;
	cout << n << endl;
	return 0;
}
//源文件2  5_17(2).cpp
#include <iostream>  //需要cout,要引头文件
using namespace std;
extern int n;//引用性声明——声明在其它文件中定义的外部变量
void fn1()
{
	n = 100;
	cout << n << endl;
}

 结果如下:

 

二、程序编译后会出现的文件

  • 目标程序文件*.obj)——由编译器或汇编工具生成的,是模块的二进制中间文件,源程序文件(*.c/*.cpp)经过编译得到目标程序文件(.obj),再将目标程序文件输入内存,与系统提供的库函数等连接,得到可执行的程序(.exe)(.obj只给出了程序的相对地址,而.exe是绝对地址)\*注:每有一个cpp文件,就会生成一个obj文件,所有obj文件与系统文件linking后生成一个exe文件*\

  • 无编译浏览文件*.ncb)——(No Compile Browser)为VC++自动创建的跟踪文件,,其中存放了供ClassView(类的视图)、WizardBar(向导工具条)和Component Gallery(组件库)使用的信息,由VC开发环境自动生成。当自动完成的功能出问题时,可以删除此文件。build编译工程后会自动生成。
  • 工程文件*.dsp)——(Developer Studio Project)记录的是一个项目的所有配置信息。
  • 工作区文件*.dsw)——(Developer Studio Workspace)记录的是整个工作空间的配置信息,dsw里面可以包含多个dsp。
  • 编译信息文件*.plg)——编译时的error和warning信息文件(实际上是一个html文件(超文本标记语言文件文档)),一般用处不大。


 ------over------

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值