在自己的标头中使用现有标头

时间:2012-06-24 13:04:52

标签: c++

我正在尝试编写头文件。我可以写简单的标题,如add(int x,y)return x + y; 。但是当我试图变得更加复杂时,视觉工作室给出了错误。我猜错误与<fstream>有关。它始终显示

  

“错误C2065:'fstream':未声明的标识符”。

我的cpp文件的第一行是void get_int(fstream& stream, int offset)#include<fstream>除外),第一行是.h文件的定义是

#ifndef GET_H
#define GET_H

int get_int(fstream& stream, int offset);

#endif

就是这样。这段代码有什么问题?

2 个答案:

答案 0 :(得分:3)

你必须这样做:

#ifndef GET_H
#define GET_H

#include <fstream>

int get_int(std::fstream& stream, int offset);

#endif

请注意#include <fstream>和添加的std::前缀。需要资格认证,因为所有C ++标准库......事物......都在该命名空间中定义。你不应该在标题中添加using namespace std;using std::fstream;,因为这污染了全局命名空间并且违背了namespace std存在的目的:包括你的标题的人不希望有什么东西被拉入全局命名空间,这可能与其他人使用的命名冲突。

答案 1 :(得分:2)

#include <fstream>

也必须在您的头文件中。它进入包含翻译单元,但它仍然需要看到它,因为在扩展.cpp文件内部时,它最终会在fstream的#include之上。这样,您可以确保订单不会影响编译,因为包含保护已到位。它不会尝试将其扩展两次。此外,#pragma once可以拯救小猫。

您的排序产生相同错误的原因是因为您的标题缺少“使用std :: gohere”等。

代码示例作为评论中的后续内容(防止名称空间污染):

#ifndef GET_H
#define GET_H

#include <fstream>
using std::fstream;

int get_int(fstream& stream, int offset);

#endif

或(#pragma once应该得到所有体面编译器的支持)

#pragma once

#include <fstream>
using std::fstream;

int get_int(fstream& stream, int offset);