VS 2017 C++ 编译器指出 cout(或 cin, endl) 是一个未知标志符——解决办法
在VS 2017 中编写的 main() 函数,运行,编译报错,编译器指出 cout(或 cin, endl) 是一个未知标志符(如下图所示)。 其原因是没有 名称空间编译指令,即,最常见的语句: using namespace std; // using 编译指令
解决办法
方法1:最简单的方法,也是最常见的方法。 直接添加语句 using namespace std;
#include <iostream>
int main()
{
using namespace std;
cout << "Please enter your PIN: ";
cout << endl;
cin.get();
return 0;
}
运行结果:
方法2 正规的方法(一般很少用):在使用 cout,cin, 或 endl 等,提前添加前缀:std::
#include <iostream>
int main()
{
std::cout << "Please enter your PIN: ";
std::cout << std::endl;
std::cin.get();
return 0;
}
运行结果:
方法3 在使用 cout,cin, 或 endl 等,提前添加:
using std ::cout;
using std ::cin;
using std ::endl;
#include <iostream>
int main()
{
using std ::cout;
using std ::cin;
using std ::endl;
cout << "Please enter your PIN: ";
cout << endl;
cin.get();
return 0;
}
运行结果:
那么问题来了,这是为什么呢?
其实,名称空间是C++特性,目的让用户编写大型程序以及将多个厂商现有的代码组合起来的程序 更加容易,并且有助于组织程序。
举个直观的例子,假设百度和谷歌 两家公司 可能使用已经封装好的的产品,而它们都包含一个名为 haha( ) 的函数,那个有用户想使用名为 haha( ) 的函数,若直接使用,则编译器不知道指的是哪家公司(百度还是谷歌)的版本,则编译器会报错。因此,百度可以将其放到一个名为 Baidu 的名称空间中;同样,谷歌也可以将其放到名为 Google 的名称空间中。其表示如下:
Baidu ::haha("la la"); // use Baidu namespace version
Google ::haha("he he"); // use Google namespace version
按照这种方式,类,函数和变量便是C++编译器的标准组件,它们都将被放置在名称空间 std 中。 仅当头文件没有扩展名 h 时,情况才如此。在 iostream 中定义的 cout, cin, endl 等变量实际上是: std::cout; std::cin; std::endl; 因此可以用以下方式进行编码:
#include <iostream>
int main()
{
std::cout << "Please enter your PIN: ";
std::cout << std::endl;
std::cin.get();
return 0;
}
这也是上述的 方法2, 这是规范写法 。在大多数情况下,很麻烦,于是 using编译指令 出来了。(方法3)
using std::cout;
using std::cin;
using std::endl;
最后,最简单的,也是最常见的方法(方法1),可以使用 std 名称空间中定义的名称 ,不必使用std:: 前缀。其表达式如下:
using namespace std; // 方法1
总之:cout, cin, endl 等 使用的是C++标准名称空间。