Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.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++ 为什么visual studio需要<;字符串>;编译,但代码块不编译?_C++_String_Visual Studio_Codeblocks_Getline - Fatal编程技术网

C++ 为什么visual studio需要<;字符串>;编译,但代码块不编译?

C++ 为什么visual studio需要<;字符串>;编译,但代码块不编译?,c++,string,visual-studio,codeblocks,getline,C++,String,Visual Studio,Codeblocks,Getline,基本上,是在代码块上编译,但不是在VisualStudio2015上编译,除非我添加 #include <string> #包括 到其中一个文件,然后我从代码的第一行了解错误 1>------ Build started: Project: ConsoleApplication2, Configuration: Release Win32 ------ 1> pytanie.cpp 1>pytanie.cpp(25): error C3861: 'getlin

基本上,是在代码块上编译,但不是在VisualStudio2015上编译,除非我添加

#include <string>
#包括
到其中一个文件,然后我从代码的第一行了解错误

1>------ Build started: Project: ConsoleApplication2, Configuration: Release Win32 ------
1>  pytanie.cpp
1>pytanie.cpp(25): error C3861: 'getline': identifier not found
1>pytanie.cpp(42): error C2679: binary '<<': no operator found which takes a 
right-hand operand of type 'std::string' (or there is no acceptable 
conversion)
1>----构建已启动:项目:控制台应用程序2,配置:发布Win32------
1> pytanie.cpp
1> pytanie.cpp(25):错误C3861:“getline”:找不到标识符

1> cpp(42):错误C2679:binary'允许但不要求任何标准头文件包含任何其他头文件

因此,在一个编译器上,您包含的一个头确实包含
,而在另一个编译器上,它们都不包含


这通常是很棘手的(我的意思是,即使对于专家来说,也很难做到正确),但为了便于移植,我担心您需要知道哪些头文件包含您使用的声明,并确保包含所有声明。

任何标准头文件都可以包含,但不需要包含任何其他头文件

因此,在一个编译器上,您包含的一个头确实包含
,而在另一个编译器上,它们都不包含


这通常是很棘手的(我的意思是,即使对于专家来说,也很难做到正确),但为了便于移植,我担心您需要知道哪些头包含您使用的声明,并确保您包含所有声明。

在您的代码块案例中,还有一些其他头包含
(或它的某个子集)。C++允许标准头以其他方式包含其他标准头。显然,无论您在代码块中使用什么工具链,都会发生这种情况,但在Visual Studio中不会发生这种情况。这与Visual Studio与代码块无关。这与它们的底层工具链的头有关,即MSVC的头和显然非MSVC工具链代码块使用的头(可能是GCC+glibc)。显然,glibc的iostream头包含
,而MSVC的头不包含。visualstudio和codeblock都不是编译器。它们是调用编译器的程序。这并不意味着它们是编译器,就像
cmd.exe
不会仅仅因为
cl.exe
是从那里开始就成为编译器一样。@Christian和标准没有谈论编译器,只讨论实现。@Christian这可能是一个注释;-)其他一些头包含在您的代码块案例中的
(或它的一些子集)。C++允许标准头以其他方式包含其他标准头。显然,无论您在代码块中使用什么工具链,都会发生这种情况,但在Visual Studio中不会发生这种情况。这与Visual Studio与代码块无关。这与它们的底层工具链的头有关,即MSVC的头和显然非MSVC工具链代码块使用的头(可能是GCC+glibc)。显然,glibc的iostream头包含
,而MSVC的头不包含。visualstudio和codeblock都不是编译器。它们是调用编译器的程序。这并不意味着它们是编译器,就像
cmd.exe
不会仅仅因为
cl.exe
是从那里开始就成为编译器一样。@Christian和标准没有谈论编译器,只讨论实现。@Christian这可能是一个注释;-)如果您使用指定要在某个标头中声明/定义的内容,则需要包含该标头,因为即使对于某个平台或编译器,文件中未指定的包含也可能会发生更改,我认为这既不难也不难。“依赖任何其他东西都是一种乌托邦,”像素化学家我觉得这很棘手;YMMV。特别是,您必须确切地知道正在使用哪些重载(请考虑
operator>
getline
),如果您犯了错误,在尝试其他编译器之前不会收到任何警告。示例:
std::cout
#include
需要哪些标题-但问题是:如果您不知道需要哪个标题,您必须查找它。这可能是恼人的,但我不认为这是困难的。@ PixelCalist:你的答案是正确的,只有C++ 11。在此之前,
不保证包含
,而
std::endl
中,“这通常是很棘手的(我的意思是,即使对于专家来说,也很难做到正确)”这有什么困难?用谷歌搜索你正在使用的符号,点击第一个结果(链接到cppreference.com),然后读取页面顶部的标题名。我同意你的说法,理论上讲,操作员提出了一个问题,但是在实践中,库的设计已经足够好了,大多数情况下都没有。如果您使用指定在某个标头中声明/定义的内容,则需要包含该标头,因为即使对于某个平台或编译器,文件中未指定的包含也可能会发生更改,我认为这既不棘手也不困难。“依赖任何其他东西都是一种乌托邦,”像素化学家我觉得这很棘手;YMMV。特别是,您必须确切地知道正在使用哪些重载(请考虑
operator>
getline
),如果您犯了错误,在尝试其他编译器之前不会收到任何警告。示例:
std::cout
#include
需要哪些标题-但问题是:如果您不知道需要哪个标题,您必须查找它。这可能是恼人的,但我不认为这是困难的。@ PixelCalist:你的答案是正确的,只有C++ 11。在此之前,
不保证包含
,而
std::endl
中,“这通常是很棘手的(我的意思是,即使对于专家来说,也很难做到正确)”这有什么困难?用谷歌搜索你正在使用的符号,点击第一个结果(链接到cppreference.com),然后读取页面顶部的标题名。理论上,我会给你一个问题,但是
'std::basic_ostream<char,std::char_traits<char>>
&std::basic_ostream<char,std::char_traits<char>>::operator <<(const void *)'
#include <string>