我正在尝试编写头文件。我可以写简单的标题,如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
就是这样。这段代码有什么问题?
答案 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);