1

我有两个文件,my_program.cpp它的头文件my_program.h.

my_program.cpp包含以下内容:

#include "my_program.h"
using namespace std;

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

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

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

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

4

2 回答 2

5

你真的应该包括<string>.

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

至少根据我的经验,这也是一个可能会从一个编译器版本更改为下一个版本的问题,因此即使您不打算移植到其他任何版本,您的代码也可能会因为看似微不足道而停止工作除非您包含正确的标题,否则请升级。

于 2012-04-10T18:45:11.073 回答
0

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

包含 iostream 标头(定义std::wstring——可能通过它包含的其他标头)后,编译器知道wstring指的是什么,并且可以正确解析typedef.

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

但是,通常最好使标头尽可能保持一致(因此在您的情况下,在标头中包含相关标头,而不是 .cpp),因此包含器不需要记住要包含的其他标头以及使其按预期工作。

于 2012-04-10T18:42:29.717 回答