C++ 为什么visual studio需要<;字符串>;编译,但代码块不编译?
基本上,是在代码块上编译,但不是在VisualStudio2015上编译,除非我添加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
#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>