按照市面上大多数C++程序设计教科书推荐的做法,可以使用#include
我们就启动Qt Creator,在其中建立一个基于控制台的应用程序,代码如下:
![image[转]零基础学Qt 4编程实例之四:理解并正确使用名字空间零基础学qt](/Files/20116/0d15aa44-cc34-4205-b075-cfa1c60cc359.gif)
接下来依次运行qmake和 Ctrl+B编译程序代码,提示0个错误和2个警告,警告的原话如下:
#warning This file includes at least _disibledevent=>
![imageimage[转]零基础学Qt 4编程实例之四:理解并正确使用名字空间零基础学qt](/Files/20116/81e2f954-48c6-4a18-85d5-027f96b995ea.gif)
然后Ctrl+B编译程序。
可是,问题又出现了,程序提示一个错误和一个警告,情形如图所示:
![imageimageimage[转]零基础学Qt 4编程实例之四:理解并正确使用名字空间零基础学qt](/Files/20116/ebc67e80-2f1c-41d1-9d14-d11d24978e54.gif)
也就是编译器并未识别#include
我们借这个问题讲解如下:
iostream是输入/输出流库标准文件(注意它没有后缀),它包含cout的信息,这对我们的程序是必需的。#include是预处理指示符(preprocessor directive),它能使得iostream的内容读入到我们的程序中。
在C++标准库中定义的名字,如cout,不能在程序中直接使用,除非在预处理器指示符:
#include
后面加上语句:
using namespace std;
这条语句被称作是using 指示符(using directive)。C++标准库中的名字都是在一个称作std的名字空间中声明的,这些名字在我们的程序文本文件中是不可见的,除非我们显式的使它们可见。using指示符告诉编译器要使用在名字空间std中声明的名字。
这样就清楚了,依据上面的讲解,再次修改代码如下:
![imageimageimageimage[转]零基础学Qt 4编程实例之四:理解并正确使用名字空间零基础学qt](/Files/20116/c74af2ef-e12d-48e6-8bec-2ef26136f202.gif)
按下Ctrl+B,编译程序,无错误无警告。程序运行效果如图所示:
![imageimageimageimageimage[转]零基础学Qt 4编程实例之四:理解并正确使用名字空间零基础学qt](/Files/20116/28b67da3-9ca4-4988-b199-a844904fa763.gif)
更好的解决方案
为了使名字空间中声明的名字在我们的程序中可见,指示符using通常被视作是一种比较差的选择方案。在上面的程序代码中,指示符using使头文件
现在,我们对命名空间机制已经有了一些了解。有两种机制可以替代指示符using,使得我们可以引用到隐藏在名字空间std中的名字string。
一种是我们可以使用限定的名字,例如:
#include
......
std::string str = qstr.toStdString();
std::cout << str;
或者如下使用using声明:
#include
using std::string;
......
string str = qstr.toStdString();
cout << str;
也就是说,为了使用名字空间中声明的文字,建议使用带有精细选择功能的using声明代替using声明。
顺带多说一句,从技术上来讲,已经没有所谓的
好了,本节重点就是:理解名字空间的作用并正确的使用它。
扩展阅读:#include
使用#include
首先要明确的是,这两种写法是不同的,这在本节的正文中已经有了说明。
如果是新写程序,那么首选是#include
从功能性的角度来讲,
流。另外,输入输出流的C++标准规范接口在一些微妙的细节上都已改进,因此,
从上面说的意义上来讲,一般情况下,使用#include
因为这些实质上的不同,你不能在一个程序中混淆使用这两个库。做为一种习惯,在新的代码中一般使用
最后,给出一个具体的例子,大家可以在Qt Creator中构建2个基于控制台的程序,分别运行,测试时间。
程序代码即是main.cpp的完整内容。
第一个,使用名字空间的main.cpp
#include
#include
using namespace std;
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QString qstr = QObject::tr("Hello Qt!");
string str = qstr.toStdString();
for ( qint16 i = 0; i < 10000; i++)
{
cout << str +'\n';
}
return a.exec();
}
第二个,不使用名字空间的main.cpp
#include
#include
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QString qstr = QObject::tr("Hello Qt!");
string str = qstr.toStdString();
for ( qint16 i = 0; i < 10000; i++)
{
cout << str +'\n';
}
return a.exec();
}
在我的机器上测试,前者比后者慢了很多,大概有2-3倍的样子。有兴趣的朋友可以测试一下。
关于名字空间的话题还有很多,就初学C++的朋友而言,这里介绍的已经足够日常使用了。如果有兴趣,可以查阅标准库的说明以及相关著作。
最新评论