涉及iostream和wstring的奇怪的C ++行为

时间:2012-04-10 18:39:31

标签: c++ iostream wstring

我有两个文件my_program.cpp及其标题my_program.h

my_program.cpp仅包含

#include "my_program.h"
using namespace std;

my_program.h包含一个指向函数的指针,该函数返回wstring,如下所示:

using namespace std;
typedef wstring (*my_function)(wstring, int, int, int, int);

程序不能在这种状态下编译(在typedef处停止...说ISO C ++禁止声明'wstring'没有类型)但如果我在#include <iostream>之前添加#include "my_program.h" .cpp文件,该程序奇迹般地编译。

为什么会这样?我只是希望我没有犯下一个愚蠢的错误,现在我会被嘲笑。

2 个答案:

答案 0 :(得分:5)

你真的应该包括<string>

从事物的声音来看,你的编译器的<iostream>碰巧包含<string>,所以它可以工作,但在不同的编译器上它可能没有。 C ++允许标准头包含其他标准头,但不需要它。在某些情况下,你只得到一个类的声明,所以有些东西有效,而有些则没有。

至少根据我的经验,这也是一个问题,可能会从一个版本的编译器变为另一个版本,所以即使你不打算移植到其他任何版本,你的代码也可能因为除非你包括正确的标题,否则看似微不足道的升级。

答案 1 :(得分:0)

在添加#include <iostream>之前,编译器不知道wstring是什么 - 因此错误

在包含iostream标头(定义{{​​1}} - 可能通过其中包含的其他标头)之后,编译器知道std::wstring引用的内容并且可以正确解析wstring

要记住的一件事是编译器只关心所谓的编译单元(.cpp文件),而不是标题;当编译单元包含它们时,标题就会起作用(想想逐字复制粘贴)。因此,您可以在typedef之前的任何位置包含iostream(或其他人指出<string>),以使其正常工作 - 从这个角度来看,包括它在标题计数与包含之前相同它位于标题的第一行。

然而,通常一个好主意是使标题尽可能保持一致(因此在您的情况下包括标题中的相关标题,而不是.cpp),因此包含者不需要记住其他标题标题也包括在内以使其按预期工作。