As programs get larger, it is not uncommon to split them into multiple files for organizational purposes. One advantage of working with an IDE is they make working with multiple files much easier. You already know how to create and compile single-file projects. Adding new files to existing projects is very easy.
In Visual Studio 2005 Express, right click on “Source Files” in the Solution Explorer window on the left, and choose Add -> New Item. Give the new file a name, and it will be added to your project.
In Code::Blocks, go to the file menu and choose “new file”. Give the new file a name, and Code::Blocks will ask you if you want to add it to the active project. Click “Yes”. Note that you will also have to click the “Release” and “Debug” checkboxes, to make sure it gets added to both versions.
Compile your project just the same as before. Couldn’t be much easier!
Now, consider the following multiple-file program:
add.cpp:
int add(int x, int y)
{
return x + y;
}
main.cpp:
#include <iostream>
int main()
{
using namespace std;
cout << "The sum of 3 and 4 is: " << add(3, 4) << endl;
return 0;
}
Try compiling this program for yourself. You will note that it doesn’t compile, and it gives the same compiler error as the program in the previous lesson where the functions were declared in the wrong order:
add.cpp(10) : error C3861: 'add': identifier not found add.cpp(15) : error C2365: 'add' : redefinition; previous definition was 'formerly unknown identifier'
When the compiler is compiling a code file, it does not know about the existence of functions that live in any other files. This is done so that files may have functions or variables that have the same names as those in other files without causing a conflict.
However, in this case, we want main.cpp to know about (and use) the add() function that lives in add.cpp. To give main.cpp access to the add function, we can use a forward declaration:
main.cpp with forward declaration:
#include <iostream>
int add(int x, int y); // forward declaration using function prototype
int main()
{
using namespace std;
cout << "The sum of 3 and 4 is: " << add(3, 4) << endl;
return 0;
}
Now, when the compiler is compiling main.cpp, it will know what add is. Using this method, we can give files access to functions that live in another file. However, as programs grow larger and larger, it becomes tedious to have to forward declare every function you use that lives in a different file. To solve that problem, the concept of header files was introduced. We discuss header files in the lesson on header files.
Try compiling add.cpp and the main.cpp with the forward declaration for yourself. We will begin working with multiple files a lot once we get into object-oriented programming, so now’s as good a time as any to make sure you understand how to add and compile multiple file projects.
1.9 — Header files
|
Index
|
1.7 — Forward declarations
|
1.9 — Header files
Index
1.7 — Forward declarations
Hey.. I am using CodeBlocks, I didn’g get that with the save and whatever…actually I didn’t understand what’s about multi-file program…I created both files add.cpp and main.cpp, so…?
can anybody help me with multiple files, i add the new item in the project a new .cpp item and do like it says here but it gives me errors what is it i have to do?? please
the example for the add.cpp does not show the
#include “stdafx.h”//it is an individual .cpp
#include //it has a return function
it needs to be included…
I have been able to do everything in this tutorial up till now and I still believe it is a great tutorial btw. I have made two files both in the source folder using VS 2010 I have used the forward declaration in the main screen but I still get errors. Here is the main.cpp:
#include “stdafx.h”
#include
int add(int x, int y)
int main()
{
using namespace std;
cout << "The sum of 3 and 4 is: " << add(3, 4) << endl;
return 0;
}
=========================================================
and here is the add.cpp:
#include "stdafx.h"
int add(int x, int y)
{
return x + y;
}
I know it was answered above but how does it know what path to take to look for the file if it is not defined to include by add.cpp or add.h
#include is there also.
Urmm…..
i guess you forgot to put a semicolon at the end of line 3 in the main.cpp which is the forward declaration.
as you will need to end up with:
#include “stdafx.h”
#include “iostream”
int add(int x, int y);
int main()
{
using namespace std;
cout << "The sum of 3 and 4 is: " << add(3, 4) << endl;
return 0;
}
It should probably be mentioned here that #include “stdafx.h” should be placed at the top of each file as the program did not compile without it. I had assumed incorrectly that the compiler would simply include whatever was on the main function file for each file. I’m assuming if you want to include anything else it must be placed at the top of each file.
I use a turbo c++ 3.0 compiler. It has worked perfectly in every code so far.
I have tried the above code word for word but it didn’t work. it doesn’t link it.
do I have to follow some extra steps??
I’m using Code::Blocks and it’s complaining about multiple definitions:
File Line Message obj\debug\extra.o In function 'Z3addii' F:\C++\test\ad... 2 multiple definitions of 'add(int, int)' Obj\Debug\add.... 2 first defined here === Build finished: 2 errors, 0 warnings ===I am dealing with the same error.
It resolves when I add the add() below the main(), though the point of this is to rely on add() in a separate file. I would greatly appreciate help with this.
for those of you who faced linker errors, the reason could be that you did not add the iostream header file in your cpp file where you have defined the function
i have put in the code for both files in to code blocks exactly. \(main and add)
but when it comes to compiling it it seems fine with the code but give the warning message.
“WARNING: Can’t read file’s timestamp: C:\Documents and Settings\Desktop\multi-file programs\Untitled1.c
Linking console executable: bin\Debug\multi-file programs.exe
mingw32-g++.exe: obj\Debug\Untitled1.o: No such file or directory
something’s up with your compiler. Re-install & reconfigure.
I couldnt get this to run….. When i compile the the two files i get a error saying ” Undefined reference to add(int,int) ”
I have the code set up all the same as yours. Im assuming that the compiler doesnt see add.cpp.
Im using code::blocks.
I found out why it isnt running on codeblocks (atleast on my computer). When you open a new file for the project, it creates the file with just *.c instead of *.cpp. Try saving the new “add” file with .cpp at the end. I did that and it ran with no errors