0

我正在尝试编写头文件。我可以编写简单的标题,例如 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

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

4

2 回答 2

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;or using std::fstream;,因为这会污染全局名称空间并破坏存在的目的namespace std:包括您的标头在内的人不希望将内容拉入全局名称空间,这可能与其他人使用的命名冲突.

于 2012-06-24T13:29:06.673 回答
2
#include <fstream>

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

您的订购给出相同错误的原因是因为您的标题缺少“使用 std::goeshere”等。

代码示例作为注释中的后续内容(防止命名空间污染):

#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);
于 2012-06-24T13:16:08.193 回答