涉及 iostream 和 wstring 的奇怪C++行为
Strange C++ behaviour involving iostream and 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"),但是如果我在.cpp文件中的#include "my_program.h"
之前添加#include <iostream>
,程序就会奇迹般地编译。
为什么会这样?我只是希望我没有犯一个愚蠢的错误,我现在会被嘲笑。
你真的应该包括<string>
.
从声音上看,编译器的<iostream>
恰好包含<string>
,因此它可以工作,但在不同的编译器上可能不起作用。 C++允许标准标头包含其他标准标头,但不需要它。在某些情况下,您只会获得类的声明,因此某些内容有效,而其他内容则无效。
至少根据我的经验,这也是一个可能会从一个版本的编译器更改为下一个版本的问题,因此即使您不打算移植到其他任何内容,您的代码也可能由于看似微不足道的升级而停止工作,除非您包含正确的标头。
在添加#include <iostream>
之前,编译器不知道wstring
是什么 - 因此错误
在包含iostream标头(定义std::wstring
- 可能通过它包含的其他标头)后,编译器知道wstring
引用的内容,并且可以正确解析typedef
。
要记住的一件事是,编译器只关心所谓的编译单元(.cpp文件),而不是标头;当编译单元包含它们时,标头就会发挥作用(想想逐字复制粘贴)。 因此,您可以在typedef
之前的任何位置包含iostream
(或其他人<string>
指出的那样)以使其工作 - 从这个角度来看,在标头计数之前包含它与将其包含在标头的第一行相同。
但是,通常最好使标头尽可能自洽(因此在您的情况下,在标头中包含相关标头,而不是.cpp),因此包含器不需要记住要包含的其他标头以及使其按预期工作。
- 理解boost::asio-async_read在无需读取内容时的行为
- 模板-模板参数推导:三个不同的编译器三种不同的行为
- arr[-1]在c++中的奇怪行为
- 继承期间显示未知行为的子类
- 如何在c++中使用引用实现类似python的行为
- G锁定铸造到基础上会释放模拟行为
- 在C++中对T*类型执行std::move的意外行为
- std::当在256字节边界上写入整数时,流的奇怪行为
- 不知道某个东西是否被忽略会引入未定义的行为吗
- 奇怪的构造函数行为
- 重载运算符new[]的行为取决于析构函数
- 不同语言中相同代码的不同行为
- 处理除以零会导致<csignal>意外行为
- 试图理解类对象的行为
- c++11评估顺序(未定义的行为)
- 从结构寻址时,MMAP变量的行为很奇怪
- 我可以做些什么来消除或最小化这种将提供相同功能和行为的代码重复
- 读取文件时运行时的未知行为
- strncpy之后的char数组的错误行为
- 此增量后语句是否会导致未定义的行为?