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

Strange C++ behaviour involving iostream and wstring

本文关键字:C++ 行为 iostream wstring 涉及      更新时间:2023-10-16

我有两个文件,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"),但是如果我在.cpp文件中的#include "my_program.h"之前添加#include <iostream>,程序就会奇迹般地编译。

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

你真的应该包括<string> .

从声音上看,编译器的<iostream>恰好包含<string>,因此它可以工作,但在不同的编译器上可能不起作用。 C++允许标准标头包含其他标准标头,但不需要它。在某些情况下,您只会获得类的声明,因此某些内容有效,而其他内容则无效。

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

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

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

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

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