再探C++Primer (1) 关于编译及IO流

放肆的年华 提交于 2019-12-07 19:34:50

之前在看primer的时候,第一章的内容一般都会跳过去,今天打算从头再看一次的时候,反而注意到了第一章的东西,很简单的东西,也学到了一些之前没有关注的内容。

##编译、运行程序# 在之前都是使用现成的IDE来编译运行程序,但是并没有想过究竟编译是个怎么样的过程。在学习linux的过程中,曾经了解过一些编译的过程:编译会将cpp文件内容先预处理,然后用编译器翻译成汇编语言文件,再经汇编器翻译成.o文件,不同的.o文件经由链接器连接到一起成为机器可以识别的.out文件(windows中的.exe)。

那么在windows中cpp文件是怎么由vs2015之类的IDE来编译链接的呢?

在linux中,编译器是gnu,使用gnu编译一个cpp程序的步奏是使用命令g++,而在windows中编译器是vc/vc++,在vs中集成了vc/vc++编译器,所以我们可以使用vs来编译c++程序文件。

随便百度一下,就可以知道windows控制台编译c++程序文件的命令是cl, 格式为CL [option...] file... [option | file]... [lib...] [@command-file] [/link link-opt...],关于具体的命令去查阅文档就可以了,现在只需要知道在cmd控制台,当前目录下的a.cpp文件编译命令是cl a.cpp就可以了。

但是当我使用了这个命令后,系统提示我没找到这个命令,是因为cl.exe文件存放在vc的bin目录下,没有把vc的bin目录放入系统环境变量,系统自然找不到cl在哪里。

所以我们需要做的事情,第一个是下载安装vc(当然也可以下载vs并安装vc,vc文件夹在vs的安装目录下可以找到),在vc的目录下,有个bin文件夹,将vc的bin目录放入环境变量path即可。

现在我们写一个helloworld来用控制台运行cpp文件观察效果如何。

#include <iostream>
int main()
{
	std::cout<<"Hello World!"<<std::endl;
	return 0;
}

例如我的helloworld.cpp存放在e盘c++目录下,那么输入以下命令来编译该程序:

cd /d e:\c++
cl helloworld.cpp

然后系统提示我们iostream文件没有找到,这是因为iostram库存放在vc的include目录下,而我们并没有将它放在我们的当前目录下,也没有将它置入环境变量,系统自然无从找起。

所以有两个解决方法,第一个是把iostream拷贝到当前目录,当然这还是错的,因为iostream中包含了istream,istream又包含了ostream,等等,这样下去我们就要把include整个拷贝过来了,这样显然是不合适的。

第二个办法是在环境变量中添加include文件夹,使得系统在编译过程中在自己的环境变量中找到iostream库。我们自己配置起来是一件很麻烦的事情,但是这个过程还是要知道的。

很庆幸的是vc其实已经帮我们做好了这些配置的工作,就在vc目录下的vcvarsall.bat,一个批处理文件将我们常用的环境变量和工作目录全部都配置好了,所以我们只要在编译前运行它就好了,例如我的vs在d盘根目录,则:

d:\vs2015\vc\vcvarsall.bat
cd /d e:\c++
cl helloworld.cpp

如果上面的过程没有问题的话,那么现在你的程序大概已经编译成功了,在cpp所在的目录下会出现一个.obj和.exe文件,一个是编译的过程文件,一个是可执行程序。直接用

helloworld

命令即可执行,会在屏幕上输出Hello World!。

##IO流#

c++没有定义任何输入输出语句,相反提供了一个全面的标准库来提供io机制。

iostream库包含两个基础类型istreamostream,表示输入流和输出流,流的意思是字符序列,表示顺序生成或顺序消耗。

标准库提供了4个IO对象,分别是cincoutcerrclog,分别进行标准输入,标准输出,标准错误输出,标准日志信息。

<<”流输出符号,“>>”流输入符号,可以进行重定义。

endl是操控符,曾经以为它仅仅表示换行,其实它还有更重要的作用,就是将缓冲区数据写入输出对象中,没有endl,输出的数据仅仅储存在缓冲区中,发生意外容易丢失或损坏,而输入到io对象后,才能够真正输出出来。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!