文档章节

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

大鲸鱼锅锅
 大鲸鱼锅锅
发布于 2016/07/02 00:17
字数 1241
阅读 16
收藏 3

之前在看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对象后,才能够真正输出出来。

© 著作权归作者所有

大鲸鱼锅锅
粉丝 5
博文 14
码字总数 15885
作品 0
武汉
程序员
私信 提问
C++primer标准库(2)

作为大四应届生o( ̄︶ ̄)o 最近为了后续的面试工作地点看C++primer再次深入学习C++写里一点笔记: 如下: 1. io库 • **istream(输入流)类提供输入操作。 • ostream(输出流)类提供输出操作。 ...

微小的鱼233
2018/03/02
0
0
什么是using指令?它是如何实现的?

有人考我关于指令,我的回答: 不能详解,没有学过编译原理,不过大概有个模糊的概念:指令就是计算机完成的一步操作,(大d概类似+,-,*,/,跳行,赋值?),所以我的理解using..........写到这里我突然发...

llwwzz
2014/09/07
135
0
再探迭代器

除了为每个容器定义的迭代器之外,标准库在头文件iterator中还定义了额外几种迭代器,包括: 插入迭代器(insert iterator):这些迭代器被绑定到一个容器上,可用来向容器中插入元素; 插入器...

种地瓜
2016/04/01
35
0
再探C++Primer (3)关于unicode和多字节字符集

在ASCⅡ码制定的过程中,对于代码是6、7、8位争议不断,由于可靠性的原因,舍弃了6位,而由于成本问题(上世纪60年代来说,8位代价是非常昂贵的),选择了7位编码。于是最后代码共有26个小写字...

大鲸鱼锅锅
2016/07/03
24
0
再探C++Primer (4)指针、引用、对象和内存

基本内置类型就是算数类型和空类型,算数类型包括字符、整数、布尔值、浮点数,空类型是void; 复合类型指基于其他类型定义的类型,例如指针和引用。 - 引用就是给对象起的别名,通过声明对象...

大鲸鱼锅锅
2016/07/07
13
0

没有更多内容

加载失败,请刷新页面

加载更多

启动参数

常用启动参数,通过 -Dxx.yy=zz注入应用参数 -Deureka.instance.metadata-map.starkGroup=test3 -Dserver.port=8989 本地调试过程中,可改变端口来启动多个相同服务。修改启动的VM参数即可...

ZH-JSON
5分钟前
0
0
ES配置修改

查看配置 GET /_cluster/settings 修改配置 PUT /_cluster/settings{ "persistent" : { "xpack" : { "monitoring" : { "collection" : { "enabled" : ......

messud4312
16分钟前
2
0
Spring事务传播属性有那么难吗?看这一篇就够了

Spring事务传播属性有那么难吗?看这一篇就够了 笔者文笔功力尚浅,如有不妥,请慷慨指出,必定感激不尽 学习东西要知行合一,如果只是知道理论而没实践过,那么掌握的也不会特别扎实,估计过...

不学无数的程序员
16分钟前
2
0
VMware vSphere ESXi主机的访问控制

在vShpere中,访问ESXi主机的途径很多,如下: ESXi DCUI ESXi Shell ESXi SSH ESXi Host Client vCenter --> vSphere web client / vSphere Client VMware vSphere ESXi主机的访问控制,除了......

大别阿郎
41分钟前
4
0
大神讲解CGI、FastCGI和PHP-FPM关系图解

参考资料 概念了解:CGI,FastCGI,PHP-CGI与PHP-FPM:http://www.nowamagic.net/librarys/veda/detail/1319 php中fastcgi和php-fpm是什么东西:https://www.zybuluo.com/phper/note/50231 ......

网络小虾米
51分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部