我有一个关于测试用户定义的头文件的问题。 所以,这是一个例子。
#include <iostream>
using namesapce std;
#include "header.h"
#include "header.h" // I wonder the reason why I need to write this down two time for testing ifndef test.
int main()
{
cout << "Hello World!" << endl;
cin.get();
}
我了解到我需要在driver.cpp中写下两次用户定义的头文件名。但是,我无法理解为什么我需要这样做。
而且,这是第二个问题。
#include <iostream>
#include <fstream>
using namesapce std;
int main()
{
fstream fin;
fin.open("info.txt");
if(!fin.good()) throw "I/O Error\n"; // I want to know what throw exactly do.
else cout << "Hello World!\n";
cin.get();
}
所以,我的问题是throw的功能。 我意识到,如果我使用throw而不是cout,我的编译器将被终止。 我想知道究竟做了什么。
由于我是新来的,我可能在格式化和一些规则方面犯了一些错误,所以如果我做了,请随意指出它们。
谢谢!
答案 0 :(得分:0)
关于你的第一个问题想象下面的例子:
MyHelper.cpp
int sum( int first , int second )
{
return first + second;
}
TEST.CPP
#include<iostream>
#include"MyHelper.cpp"
#include"MyHelper.cpp"
int main()
{
std::cout << sum(2,4) << std::endl;
}
现在您知道预编译器将#include“MyHelper.cpp”替换为相应文件的内容。
// here comes the code from iostream header
// ...
int sum( int first , int second )
{
return first + second;
}
int sum( int first , int second )
{
return first + second;
}
int main()
{
std::cout << sum(2,4) << std::endl;
}
这是编译器接收的代码。如您所见,符号和现在定义了不止一次。因此编译器将退出并出现如下错误:
t.c: In function ‘int sum(int, int)’:
t.c:7:9: error: redefinition of ‘int sum(int, int)’
int sum( int first , int second )
^
t.c:3:9: note: ‘int sum(int, int)’ previously defined here
int sum( int first , int second )
^
换句话说,如果你的includeguard有问题,那么编译器会报告这个错误。
第二个问题:
throws用于抛出异常。我认为有数以千计的异常教程。只需向您的搜索引擎选择“C ++例外教程”,然后按照其中的一个或两个。比如跟着一个例如:
http://www.learncpp.com/cpp-tutorial/152-basic-exception-handling/
(如果您只对用例感兴趣,请向下滚动到“更现实的例子”)