您现在的位置是:首页 > 正文

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

2024-02-01 04:03:13阅读 2

【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------

网站文章

  • 例子说冒泡排序

    1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。2. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。3. 针对所有的元素重复以上的步骤,除了最后一个。4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

    2024-02-01 04:03:06
  • 怎样使用计算机上的高级共享设置密码,怎么设置电脑共享密码

    怎样使用计算机上的高级共享设置密码,怎么设置电脑共享密码

    怎么设置电脑共享密码在电脑上怎么设置共享密码?一起来看看!怎么设置电脑共享密码(一)怎么设置电脑共享密码1右击“我的电脑”,从弹出的窗口中选择“管理”项。2并在打开的“计算机管理”窗口中,切换至“用户...

    2024-02-01 04:02:59
  • C++ Web编程实战

    C++ Web编程实战

    一CGI程序的工作方式 在浏览器向Web服务器请求一个后缀是cgi的URL或者提交表单的时候,Web服务器会把浏览器传过来的数据传给CGI程序,CGI程序通过标准输入来接收这些数据。CGI程序处理完数据后,通过标准输出将结果发往Web服务器,Web服务器再将这些信息发送给浏览器。 二架设Web服务器Apache 1用rpm来查看Apache是否安装 [root@localhost ...

    2024-02-01 04:02:30
  • 使用计算机进行财务处理是计算机在,计算机中级考试练习题中的理论题(含答案)...

    B.储存更多信息C.存取速度更快D.虽贵,但能储存更多信息57.相对于主机来说,硬盘既是输入设备又是输出设备。(A)A.正确B.错误58.当磁盘处于写保护时,磁盘信息(A)。A.只能读不能写B.只能写...

    2024-02-01 04:02:23
  • Ubuntu16.04安装nginx(并启用SSL)

    1.安装依赖库 安装gcc g++ 的依赖库 apt-get install build-essential  apt-get install libtool 安装pcre依赖库 pt-get install libpcre3 libpcre3-dev 安装zlib依赖库 apt-get install zlib1g-dev 安装openssl apt-get install

    2024-02-01 04:02:16
  • 我从国企辞职后,凭借编程月入20K,却不敢和父母说……

    我从国企辞职后,凭借编程月入20K,却不敢和父母说……

    C++语言,作为编程行业里出现较早的编程语言,几十年来,因为语言灵活,数据结构丰富、具有结构化、平台移植力强、程序执行效率高等特点,广受关注与应用。即使新编程语言不断涌出,智能化水平越来越高,也无法挑战C++在高级编程语言里的领先地位。C++就业前景:1.C++软件开发的需求,在系统应用开发,通信领域开发,以及专业软件的开发领域,有着广阔的就业市场,有多年开发经验的C++软件工程师,基本上...

    2024-02-01 04:01:43
  • 朴素贝叶斯算法

    朴素贝叶斯算法

    机器学习(六)朴素贝叶斯算法文章目录机器学习(六)朴素贝叶斯算法一.算法介绍二.朴素贝叶斯算法在文档分类中的应用三.相关运用3.1 API介绍3.2 案例四.总结一.算法介绍读过大学本科的,在学习《概...

    2024-02-01 04:01:38
  • python 日志打印

    python 日志打印

    参考文章python loggin 教程简单样例# 保存日志到文件 example.log ,日志级别 DEBUGlogging.basicConfig(filename='example.log'...

    2024-02-01 04:01:31
  • 错误代码 invalid-signature 错误原因: 验签出错,建议检查签名字符串或签名私钥与应用公钥是否匹配

    错误代码 invalid-signature 错误原因: 验签出错,建议检查签名字符串或签名私钥与应用公钥是否匹配

    网站对接支付宝网站支付时提示验签出错 测试时是可以支付的,换了个应用提示以上错误,并不是我们的公、私钥有误,而是传输过程中出现了编码转换, 解决方法:再发起订单支付的controller注解加上以下内...

    2024-02-01 04:01:02
  • 怎么从融云服务器端发送消息,融云开发者文档

    # 什么是 targetId ?说明: targetId 为目标 id,senderUserId 为发送方 id举例: user1 为发送方,user2 为接收方,对应 targetId 值如下:us...

    2024-02-01 04:00:56