测试用户定义的头文件和其他问题

时间:2015-10-17 21:52:00

标签: c++ header header-files fstream throw

我有一个关于测试用户定义的头文件的问题。 所以,这是一个例子。

#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,我的编译器将被终止。 我想知道究竟做了什么。

由于我是新来的,我可能在格式化和一些规则方面犯了一些错误,所以如果我做了,请随意指出它们。

谢谢!

1 个答案:

答案 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/

(如果您只对用例感兴趣,请向下滚动到“更现实的例子”)