Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 奇怪的C++;涉及iostream和wstring的行为_C++_Iostream_Wstring - Fatal编程技术网

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

C++ 奇怪的C++;涉及iostream和wstring的行为,c++,iostream,wstring,C++,Iostream,Wstring,我有两个文件,my_program.cpp及其头my_program.h my_program.cpp仅包含以下内容: my_program.h包含指向函数的指针,该函数返回wstring,如下所示: using namespace std; typedef wstring (*my_function)(wstring, int, int, int, int); 程序不在这种状态下编译(停止在TyPulf上……说ISOC+禁止声明“WSCOPE”,没有类型),但是如果我添加包含< >代码>

我有两个文件,
my_program.cpp
及其头
my_program.h

my_program.cpp
仅包含以下内容:

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

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

程序不在这种状态下编译(停止在TyPulf上……说ISOC+禁止声明“WSCOPE”,没有类型),但是如果我添加<代码>包含< <代码> >代码> >包含“MyIyStudio.h”/C++ > .CPP文件,程序奇迹般编译。 为什么会发生这种情况?我只是希望我没有犯愚蠢的错误,我现在会被嘲笑。

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

在包含iostream头(它定义了
std::wstring
——可能通过它包含的其他头)之后,编译器知道
wstring
引用了什么,并且可以正确地解析
typedef

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

但是,通常最好使标题尽可能自一致(因此在您的情况下,在标题中包含相关的标题,而不是.cpp),这样,为了使其按预期工作,包含者不需要记住要包含的其他标题。

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

在包含iostream头(它定义了
std::wstring
——可能通过它包含的其他头)之后,编译器知道
wstring
引用了什么,并且可以正确地解析
typedef

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


但是,一般来说,使标题尽可能自一致是一个好主意(因此在您的情况下,在标题中包含相关的标题,而不是.cpp),因此,为了使其按预期工作,包含者不需要记住要包含的其他标题。

您确实应该包含

从听起来,您的编译器的
恰好包含
,因此它可以工作,但在不同的编译器上可能无法工作。C++允许标准的头包含其他标准头,但不需要它。在某些情况下,您只能得到类的声明,因此有些事情可以工作,而有些事情则不行


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

您确实应该包含

从听起来,您的编译器的
恰好包含
,因此它可以工作,但在不同的编译器上可能无法工作。C++允许标准的头包含其他标准头,但不需要它。在某些情况下,您只能得到类的声明,因此有些事情可以工作,而有些事情则不行


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

我无法完全阅读此typedef声明,但是。。。您的新typename在该typedef中的何处?您是否将包含在我的程序中。h?@Frizi
我的函数
是typedef的名称。它是指向返回wstring并具有wstring,int,int。。。作为参数。
my_函数
不是“指向返回wstring的函数的指针”。
my_函数
是类型
指向返回wstring的函数的指针的别名…
。它本身不是指向任何东西的指针,但可用于定义该类型的指针:
myu函数f,或该类型的参数:
某个函数(my函数f),等等。我不能完全阅读这个typedef声明,但是。。。您的新typename在该typedef中的何处?您是否将
包含在
我的程序中。h?@Frizi
我的函数
是typedef的名称。它是指向返回wstring并具有wstring,int,int。。。作为参数。
my_函数
不是“指向返回wstring的函数的指针”。
my_函数
是类型
指向返回wstring的函数的指针的别名…
。它本身不是指向任何东西的指针,但可用于定义该类型的指针:
myu函数f,或该类型的参数:
某个函数(my函数f),等等。我使用名称空间std移动了
之前的code>将“my_program.h”
包含在cpp中,并且它是相同的。不确定“it's same”是什么意思,但是
使用名称空间std声明将
std
命名空间中的所有内容“提升”到全局命名空间中,因此
using namespace std;
typedef wstring (*my_function)(wstring, int, int, int, int);