C++ 自学教程 LearnCPP 第1.8章 包含多个文件的程序

本文是C++自学教程的一部分,讲解如何在Visual Studio和命令行环境下管理包含多个文件的程序。介绍了如何添加新文件到项目,前置声明以解决编译错误,并解决可能出现的问题,如未解析的外部符号。强调了编译器处理多文件项目的特性,以及避免常见错误的方法。
摘要由CSDN通过智能技术生成

C++ 自学教程 第1.8章 包含多个文件的程序

当程序变得越来越复杂,人们经常把它分解成多个文件以提高条理性或者重复利用。使用IDE编写程序的一个好处就是你可以轻松的同时处理多个文件。你已经知道如何编写和编译单文件项目。将新文件添加到已有项目下其实一点也不难。

在Visual studio里为你的课题添加文件

在Visual Studio里,在左侧的解决方案资源管理器(Solution Explorer)面板里右键点击“源文件”(Source Files) ,然后选择添加->新项目。确保你选择了“C++文件(.cpp)”。给你的新文件命名,它会被添加到你的项目里。

注意,如果你在文件菜单中添加了新文件(而不是使用解决方案资源管理器),那么这个新文件不会被自动添加到你的项目里。你必须手动把它加进去,相似的,面板里右键点击“源文件”(Source Files) ,然后选择添加->已有项目,然后选择你的文件。

当你编译你的项目的时候,新文件也会被自动包括进去,因为它是你项目的一部分。

使用命令行添加新文件

在命令行中,你可以自己生成一个新文件,命个名。当你编译程序的时候,你必须将所有相关的文件的名字都包括在编译指令里。比如说“g++ main.cpp add.cpp -o main”,其中 “main.cpp”, “add.cpp”都是文件名,”main”是输出文件的名字

一个多文件项目的例子

现在看看下面这个多文件程序:
Add.cpp

//#include "stdafx.h" // uncomment if using Visual Studio

int add(int x, int y)
{
    return x + y;
}

Main.cpp

//#include "stdafx.h" // uncomment if using Visual Studio
#include <iostream>

int main()
{
    std::cout << "The sum of 3 and 4 is: " << add(3, 4) << std::endl;
    return 0;
}

请自己编译这个程序试试。你会发现编译会报错,而且错误信息就跟之前章节函数位置放错的时候一样:

main.cpp(6) : error C3861: ‘add’: identifier not found

当编译器编译一个代码文件的时候,它对其他文件里的代码一无所知,也对之前编译过的文件全无印象。在这个例子里,当你编译“main.cpp”,它不会记得之前编译的“add.cpp”,所以当你编译“main”的时候他会报错说不知道标识符add是什么。

这种“健忘”和“不可见”的性质其实是刻意为之,这样做,不同文件中可以包含拥有相同名字的函数和变量,而不会引起混淆。后面的课程会讲解相关的例子。

但是在这个例子里,我们希望主函数知道add.cpp里的add()函数是什么。为了让主函数能够读取add函数,我们可以加一个前置声明:

//#include "stdafx.h" // uncomment if using Visual Studio
#include <iostream>

int add(int x, int y); // needed so main.cpp knows that add() is a function declared elsewhere

int main()
{
    std::cout << "The sum of 3 and 4 is: " << add(3, 4) << std::endl;
    return 0;
}

现在当你试着编译主函数,它会知道add是什么。前置声明使得一个文件可以读取另一个文件内部的函数。请你自己试试, 如果连接器报错的话,检查一下你有没有把add.cpp文件添加到你的项目里。

出问题了!

第一次编译多文件项目的时候很多东西都可能出错。如果哪里不对了,试着先检查一下下面几点:

  1. 如果你的编译器报错,说主函数里没有add()的定义,有可能你忘记在主函数里加入前置声明了。

  2. 如果你的连接器报错,比如说:

    unresolved external symbol “int __cdecl add(int,int)” (?add@@YAHHH@Z) referenced in function _main

    首先最有可能的是你的add.cpp没被添加进来。如果你使用visual studio或者code::blocks的话,你应该可以看到add.cpp被列在解决方案资源管理器里。如果没看见的话,试着添加add,然后再编译。

    也可能你不小心把add.cpp加到别的项目里了。

  3. 如果你使用visual studio, 记得头文件里要包含#include “stdafx.h”。

  4. 不要在主函数里添加#include “add.cpp” 的叙述语句,这样会使得编译器把add.cpp的所有内容复制到主函数里。

结论

当编译器编译一个多文件项目的时候,编译顺序是不确定的。另外,它会单独编译每个文件,而不会知道文件彼此间的信息。当我们正式开始学习面对对象的程序的时候我们会常常使用多文件项目,所以最好趁现在搞清楚怎样添加跟编译多项目文件。


说明: 这系列笔记是基于网上一个英文教程LearnCPP

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值