My header file doesn't see the file where I have all my prototypes and I don't know why :(
Printable View
My header file doesn't see the file where I have all my prototypes and I don't know why :(
Your header file should contain the prototypes.
>.< I am meaning the coding of the function
Give more details. A file usually only needs to see the declarations of functions it uses, but headers don't usually use functions, source files do. One exception is class declarations (for base classes or class members).
A file never has to see the definition of another function or class that it uses (except for templated code). Instead, you compile the definitions separately in separate source files and link them together at the end. Make sure all your cpp files are added to your project or makefile.
Like a .lib? Compile it how?Quote:
Originally Posted by Daved
HEADER
FUNCTIONSCode:#include <iostream>
#include <fstream>
void DisplayOptions();
void Overwrite(int Loops);
void Delete(std::string File);
int GetDiskSize(std::string Dir);
int GetFileSize(std::string File);
void CheckLength(std::string Dir);
std::string GetObject(std::string Object);
void MainFunction(std::string Dir,std::string File);
void RestartMainFunction(std::string Dir,std::string File);
void Choice(std::string Dir,bool Restart,std::string File);
void NoRestartMainFunction(std::string Dir,std::string File);
MAINCode:Code in seperate source file
#include "..\Header\SecSuite.h"
#include <windows.h>
#include <iostream>
#include <fstream>
/*____________________________________________________________________________*/
void DisplayOptions()
{
std::cout<<"Welcome to C.J.'s Security 'suite'!\n";
std::cout<<"Please enter what you want to do.\n"<<std::endl;
std::cout<<"To select Secure Disk Wipe, input SDW.\n";
std::cout<<"To select Secure Disk Cleanse, input SDC.\n";
std::cout<<"To select Secure File Deletion, input SFD.\n";
std::cout<<"To select ---this option is not yet available---.\n";
std::cout<<"To select ---this option is not yet available---."<<std::endl;
std::cout<<"Option:";
}
/*____________________________________________________________________________*/
void Choice(std::string Dir,bool Restart, std::string File)
{
if (Restart=true)
{
RestartMainFunction(Dir,File);
}
if(Restart==false)
{
NoRestartMainFunction(Dir,File);
}
}
/*____________________________________________________________________________*/
void Delete(std::string File)
{
File="Del "+File;
system(File.c_str());
std::cout<<"File erased."<<std::endl;
}
/*____________________________________________________________________________*/
int GetDiskSize(std::string Dir)
{
__int64 i64FreeBytes;
typedef BOOL (WINAPI *PGETDISKFREESPACEEX)(LPCSTR,
PULARGE_INTEGER,PULARGE_INTEGER,PULARGE_INTEGER);
PGETDISKFREESPACEEX pGetDiskFreeSpaceEx;
pGetDiskFreeSpaceEx=(PGETDISKFREESPACEEX)GetProcAddress(GetModuleHandle
("kernel32.dll"),
"GetFreeDiskSpaceExA");
GetDiskFreeSpaceExA(Dir.c_str(),
NULL,
NULL,
(PULARGE_INTEGER)&i64FreeBytes);
int SizeOfDisk=((i64FreeBytes/1024)/1024);
return SizeOfDisk;
}
/*____________________________________________________________________________*/
int GetFileSize(std::string File)
{
long end,begin;
int SizeOfFile;
std::ifstream a_File(File.c_str());
begin=a_File.tellg();
a_File.seekg(0,std::ios::end);
end=a_File.tellg();
a_File.close();
SizeOfFile=(end-begin);
return SizeOfFile;
}
/*____________________________________________________________________________*/
std::string GetObject(std::string Option)
{
std::string DirOrFileName;
std::cout<<"Please enter "<<Option;
getline(std::cin,DirOrFileName,'\n');
return DirOrFileName;
}
/*____________________________________________________________________________*/
void CheckLength(std::string Disk)
{
bool Loop;
while(Loop==true)
{
Disk="";
std::cout<<"Please try again:";
getline(std::cin,Disk,'\n');
if(Disk.length()==3)
{
Loop=false;
}
}
Loop=true;
}
/*____________________________________________________________________________*/
void MainFunction(std::string Dir,std::string File)
{
std::ofstream a_file(File.c_str());
int Loops=GetDiskSize(Dir);
while(Loops>0,Loops--)
{
a_file<<"1";
}
a_file.close();
std::cout<<"No space left on Drive"<<std::endl;
}
/*____________________________________________________________________________*/
void RestartMainFunction(std::string Dir,std::string File)
{
std::ofstream a_file(File.c_str(), std::ios::ate);
int Loops=GetDiskSize(Dir);
while(Loops>0,Loops--)
{
a_file<<"1";
}
a_file.close();
std::cout<<"No space left on Drive\n"<<std::endl;
}
/*____________________________________________________________________________*/
void NoRestartMainFunction(std::string Dir,std::string File)
{
std::ofstream a_file(File.c_str(), std::ios::trunc);
int Loops=GetDiskSize(Dir);
while(Loops>0,Loops--)
{
a_file<<"1";
}
a_file.close();
std::cout<<"No space left on Drive\n"<<std::endl;
}
/*____________________________________________________________________________*/
Also, if any of you have any suggestions to improve my code, I'm all ears.Code:#include "..\header\SecSuite.h"
int main()
{
std::string Dir,File,Option,Restart;
DisplayOptions();
getline(std::cin,Option,'\n');
if(Option=="SDW")
{
std::cout<<"Sorry,This option is not yet available."<<std::endl;
}
if(Option=="SDC")
{
std::string Dir=GetObject("DiskName");
if(Dir.length()!=3)
{
CheckLength(Dir);
}
File=Dir+"SecureDiskCleanse.txt";
bool FileExist=true;/*NEED TO WRITE THIS FUNCTION...*/
if(FileExist==true)
{
std::cout<<"Do you want to start where you left off?(Y or N):";
getline(std::cin,Restart,'\n');
if(Option=="Y"||"y")
{
RestartMainFunction(Dir,File);
}
else
{
NoRestartMainFunction(Dir,File);
}
}
else
{
MainFunction(Dir,File);
}
Delete(File);
std::cout<<"Disk Cleansed."<<std::endl;
std::cin.get();
}
if(Option=="SFD")
{
int Loops,SizeOfFile,OrigSizeOfFile;
File=GetObject("File location");
OrigSizeOfFile=GetFileSize(File.c_str());
std::ofstream a_file(File.c_str(), std::ios::trunc);
Loops=GetFileSize(File.c_str());
while(Loops>0,Loops--)
{
a_file<<"1";
}
Delete(File);
std::cin.get();
}
else
{
std::cin.get();
}
return 0;
}
That looks good (although you don't have an implementation of Overwrite and your header needs include guards). Just make sure that source file is added to your project or makefile, and in your other source files (like main.cpp or something), just #include "..\Header\SecSuite.h" and use the functions. The IDE (or makefile) will compile main.cpp and that source file separately, and then link them together.
Are you having a specific error? Perhaps multiple definition errors because the include guards are missing?
Yeah, the linker is saying its all "undefined refrence to"PUTMAINFUNTIONHERE
:(
Wait... so how do I link all the files together? Sorry for my nievity its just I have everything in 3 files all together... the main,header,and funtions and the header is #include in the main and funtion files, but it doesnt compile (linker error)
I swear someone posted between my two posts...
Alright... I put them in a project and it worked...
i really wish i could help you there, but i do my development on linux so i'm not sure how to make it work in windows, specially if you are using some kind of IDE. You just must tell the linker to link the resulting objects file, which would be main.o and functions.o (the header is no longer used)
This is a try at explaining the use of header files for file compilation in a really simple and possibly not 100% accurate explanation of the compilation process:
Hope this can help you understand the use of header files a little better.
- The compiler is set to compile a given file
- compiler parses the whole file and reaches a call to a function that is not defined in the file he is trying to compile, thus he can't check if arguments respect the function needs, this would mean a compiler error.
- so you #include a header file with the prototype of the function you will be calling on this file (but is not defined on this file) so that the compiler can see if the call you make in this file respects the return type, and arguments that the actual function needs
- later at linking stage all the compiled files (usually .o files) are linked together and the linker will replace all the calls for an actual address in memory (an offset from the place where the program is loaded). This is where it will actually try to get to the real compiled function code. if the function prototype in the header file is different from the actual function you won't get compilation errors but instead a linker error at this step.
- If all went well you now have a new binary file or lib ready to use.
What IDE (if any) are you using? For most people, if you add all the cpp files to the project, the IDE will compile them all and link them automatically when you build. As long as one and only one of them has a main function it should work.
The undefined reference usually means that one of the files (probably the one with the function definitions)has not been added to the project or the makefile. How to fix it depends on how you are compiling.
I had to make a project file and include all three files in it...