我有两个文件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文件,该程序奇迹般地编译。
为什么会这样?我只是希望我没有犯下一个愚蠢的错误,现在我会被嘲笑。
答案 0 :(得分:5)
你真的应该包括<string>
。
从事物的声音来看,你的编译器的<iostream>
碰巧包含<string>
,所以它可以工作,但在不同的编译器上它可能没有。 C ++允许标准头包含其他标准头,但不需要它。在某些情况下,你只得到一个类的声明,所以有些东西有效,而有些则没有。
至少根据我的经验,这也是一个问题,可能会从一个版本的编译器变为另一个版本,所以即使你不打算移植到其他任何版本,你的代码也可能因为除非你包括正确的标题,否则看似微不足道的升级。
答案 1 :(得分:0)
在添加#include <iostream>
之前,编译器不知道wstring
是什么 - 因此错误
在包含iostream标头(定义{{1}} - 可能通过其中包含的其他标头)之后,编译器知道std::wstring
引用的内容并且可以正确解析wstring
。
要记住的一件事是编译器只关心所谓的编译单元(.cpp文件),而不是标题;当编译单元包含它们时,标题就会起作用(想想逐字复制粘贴)。因此,您可以在typedef
之前的任何位置包含iostream
(或其他人指出<string>
),以使其正常工作 - 从这个角度来看,包括它在标题计数与包含之前相同它位于标题的第一行。
然而,通常一个好主意是使标题尽可能保持一致(因此在您的情况下包括标题中的相关标题,而不是.cpp),因此包含者不需要记住其他标题标题也包括在内以使其按预期工作。