【问题标题】:Using existing header in own header在自己的标头中使用现有标头
【发布时间】:2012-06-24 13:04:51
【问题描述】:

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

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

【问题讨论】:

  • 我第一次在cpp文件中添加。但它仍然给出错误。我还在.h文件中添加了它然后我删除了它。
  • 你的头文件需要有include。
  • 我的 .cpp 文件像这样 #include #include "imagelib.h" 和我的 .h 文件 #include 然后它仍然给出错误。我没有使用任何需要其他标题的东西文件。

标签: c++


【解决方案1】:

你必须这样做:

#ifndef GET_H
#define GET_H

#include <fstream>

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

#endif

注意#include &lt;fstream&gt; 和添加的std:: 前缀。资格是必需的,因为所有 C++ 标准库...事物...都在该命名空间中定义。您不应该在标头中添加using namespace std;using std::fstream;,因为这会污染全局命名空间并违背namespace std 存在的目的:包括您的标头在内的人不希望将内容拉入全局命名空间,可能与他人使用的命名冲突。

【讨论】:

  • 如果我使用#pragma 一次,我可以使用命名空间std 而没有任何冲突吗?由于其他答案,我感到困惑。
  • 没有。 #pragma once 只是一种非标准的“快速”头部防护方式。它独立于using 语句。我什至倾向于反对它(尽管所有主要编译器都支持它),因为它的非标准性。一旦您注意到在不同的上下文中使用相同的名称(但以不同的名称空间名称为前缀),从长远来看,您将掌握并学会欣赏std:: 和其他名称空间前缀,从而简化可读性。
  • 再次感谢您,我再次更改了我的代码,但这是最后一次 :)
【解决方案2】:
#include <fstream>

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

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

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

#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);

【讨论】:

  • @TalhaÇolakoğlu,不要。在名称前使用 std::,因为 using namespace std; 将太多符号拉入全局命名空间 - 这可能会导致您产生意想不到的结果。
  • @TalhaÇolakoğlu 或者您可以使用“使用 std::fstream”来选择位于特定命名空间中的标识符,在本例中为命名空间 std
  • 谢谢,这比其他更有用:) 但我认为这是有害的。我理解其他答案。
  • #pragma once 大部分时间都可以工作,有很多编译器。这够好吗?见Why isn't pragma once an ISO standard?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-09
  • 1970-01-01
  • 2015-07-29
  • 1970-01-01
  • 2017-03-07
相关资源
最近更新 更多