随着程序的增长,为了组织和重用的方便,常常会将一个程序分为多个文件。使用IDE的一个有点就是它使得多文件程序的组织变得非常容易。你现在已经知道如何创建和编译一个单文件项目,向项目中添加新文件是一件非常简单的事。
向Visual Studio项目中添加文件
在Visual Studio中,只需右击界面右侧(或左侧)“解决方案资源管理器”中的“源文件”,选择“添加”->“新建项”,然后选择需要添加的文件类型并命名即可。
Note:如果你从上方导航栏中的“文件”->“新建”而不是从“解决方案资源管理器”中添加新文件,那么新文件将不会自动添加到项目中。为了将此文件添加到项目中,可以右击界面右侧(或左侧)“解决方案资源管理器”中的“源文件”,选择“添加”->“现有项”,然后选择相应的文件即可。
向Code::Blocks项目中添加文件
Code::Blocks中,选择“文件(file)”菜单中的“新文件(new file)”,命名新文件(不要忘记添加.cpp后缀名),Code::Blocks就会询问你需要将新文件添加到现有项目中,确认。注意同时勾选“Release”和“Debug”复选框,以确保新文件同时被添加到两个版本中。
如果IDE没有询问你是否要将新文件添加到现有项目中,或者新文件没有出现在现有项目的文件列表中,那么就需要手动添加了。可右击项目窗口中的项目名称,选择“添加文件”,浏览找到刚才创建的文件,添加到项目中即可。
同上,编译程序时,新文件会自动被包含在其中,因为他们都是项目的一部分。
如果新文件未被编译和链接,检查一下新文件是否被设置为可编译链接。右击文件名,选择“属性”,在“常规”选项卡下课看到文件是否被编译链接的复选框,勾选上即可。
通过命令行向项目中添加文件
通过命令行也可以创建额外的文件,选择喜欢的编辑器,编写并命名文件。编译程序时,需要包含所有相关文件,例如“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()
{
using namespace std;
cout << "The sum of 3 and 4 is: " << add(3, 4) << endl;
return 0;
}
尝试编译此程序会发现,该程序无法编译,错误提示与上节课所示代码相同。
add.cpp(10) : error C3861: ‘add’: identifier not found
add.cpp(15) : error C2365: ‘add’ : redefinition; previous definition was ‘formerly unknown identifier’
当编译器编译程序时,它并不知道其他文件中函数的存在,这种“有限的视野”是特意设置成这样的,以防止一个文件中拥有与其他文件名称相同的变量或函数时引发命名冲突。
但在此程序中,我们希望main.cpp能够知道add()函数的存在,为了使main.cpp能够访问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()
{
using namespace std;
cout << "The sum of 3 and 4 is: " << add(3, 4) << endl;
return 0;
}
这样当编译器编译程序时,就能知道add()为何物,通过这种方式,能够赋予一个文件访问另一个文件中函数的权限。
发生了某些错误
第一次使用多文件程序时常会遇到多种错误,如果你在编译上述例子遇到错误,可以参考下面的提示。
1、如果遇到编译错误“add()未在main()中定义”,也许是你忘记添加前置声明了。
2、如果遇到有关add未被定义的链接错误,
unresolved external symbol “int __cdecl add(int,int)” (?add@@YAHHH@Z) referenced in function _main
- 最可能的原因是cpp未被正确添加到你的项目中,请参考上述添加方法。
- 也可能是你将cpp添加到了错误的项目中。
- 还可能使文件被设置为不被编译和链接,Code::Blocks参考上面解决方法,Visual Studio中“exclude from build”选项应被设置为no。
3、如果你使用了需要添加预编译头文件版本的Visual Studio,记得在每个代码文件开头都添加 #include “stdafx.h”,包括main.cpp和add.cpp。
4、不要再main.cpp中添加#include“add.cpp”,这会使得编译器直接将add.cpp的代码插入到main.cpp中,而不是将其处理为一个独立的文件,或许在此例中这种方式可以成功编译运行,但在以后的这种方式会给你带来诸多麻烦。
总结
当我们进入面向对象编程时会经常使用多文件程序,所以现在最好熟练掌握多文件项目的创建方法。