随笔分类 - C/C++
摘要:话说上回说到,C程序运行之前,必须要加载到其进程地址空间中。今儿咱就扯扯这个加载到底是怎么加载的。 一图胜前言,这个图简单说明了可执行文件加载过程的逻辑流,在此只做粗粒度概要说明。需要准确描述的,请出门左转,看源码去吧。1. 程序总是运行在进程上下文(context)中的,当输入./meml...
阅读全文
摘要:一个成功的男人背后,至少有一个伟大的女人;一个不成功的男人,至少有一双手。而一个C程序,无论成功不成功,它的背后一定有一个操作系统,一个shell,一套工具链。世界本就不公平。隐藏在显而易见的事实背后的,你若能看透,便可以站在对自己公平的那一端。1、进程地址空间一个进程一旦建立,就会自认为占有4G内...
阅读全文
摘要:浮点数格式学C的时候就知道,浮点数采用的是类似于科学计数法的表示方式。具体的浮点数的模型是:一个尾数(mantissa),一个基数(base),一个指数(exponent)和符号位表示。再百度的深一点,在规范化形式下(没错,还有非规范形式),就可以把float和double的表示格式列个表格: ...
阅读全文
摘要:厘清”指针是什么“这件事什么是整型变量?我认为可以说成是接收整型数据的变量。这样就可以得到指针变量的定义——接收指针(地址)的变量——指针就是地址,这和指针变量是两回事!!指针是个(带箭头的)16进制的数,而指针变量就是盛放这个数的容器。还不能理解?换句话说,地址可以看成是特殊点的数据类型,和整型、字符、浮点等一个地位。但是地址这厮为了弄出神秘感来,硬是给自己扣了个头衔——指针。其实,一个指针变量携带的信息不只是一个地址而已,还有要分配的内存大小。变量的指针(地址)属性是由指针符号 '*' 标识的,而内存大小是由指针变量类型标识的。指针变量初始化先看两段代码:1 int a =
阅读全文
摘要:首先,还是得说一下C标准库的发展史喽。C89中有15个标准头文件: <assert.h>、<ctype.h>、 <errno.h>、 <float.h>、 <limits.h>、 <locale.h>、 <math.h>、 <setjmp.h>、<signal.h>、<stdarg.h>、<stddef.h>、 <stdio.h>、 <stdlib.h>、 <string.h>、<time.h>C95增加了3个标准头
阅读全文
摘要:在linux中,一切都看成文件,不管是目录还是设备。所以想要熟练使用Linux,那么对文件的本质和组织结构要有一定的认识。Linux中,文件都组织成字节流(byte stream)的形式,这样就有利于数据的流动和传输。对于字节流,可以借C++中的概念来理解,C++的标准输入输出iostream和文件流fstream的本质就是字节流。Linux的文件,乍看之下只能用乱来形容。其中最让人揪心的是,linux下的程序安装并不像windows下那样给一个文件夹就行,甚至指定路径都是徒劳的。而卸载时,往往是很难扫干净的。特别是在源码包安装时,连卸载的命令都没有(至少我没百度到)。其实,只要狠下心来,花点
阅读全文
摘要:心里一直对传说中的Linux有种向往,曾经在没太了解Linux的情况下,凭着一些安装教程自己动手,结局是悲剧性的。虽然逢此一难,对Linux的热情却是更盛,于是便看了前几章《鸟哥的私房菜》。鉴于上次的悲剧和盘里的资料,所以用VM装了个Fedora,虽一切正常,可是总觉得有些怪。再说,机子运行虚拟机时的内存消耗让人心痛,再在里头运行个桌面版的Linux,还有什么体验可谈呢?后来呢,后来也没怎么弄啦,但心里还一直惦记着这件没完成的事情。最近在网上了淘了一个移动硬盘,拷了所有的资料,准备了此一愿。也不是闲得无聊,而是心里有种冲动。写这些文字纯粹是为了记录安装过程中遇到的问题和一些使用体验。初衷是为了
阅读全文
摘要:折腾了几天Emacs,配置过程实在是很繁琐,对于一个新手来说,Lisp就已经是天文啦。本来想放弃了,因为这个配置过程实在是浪费时间。当回到Windows下频繁的鼠标操作时,我想我还是继续配置好了。这里主要记录一下配置过程中我所遇到的问题吧。平台:win7软件版本:emacs-23.2(windows)、cedet1.1、ecb-2.40emacs的安装过程遍地都是,cedet和ecb这两个插件的安装与配置的说明文档也有很多。需要注意的是:1、这个版本的emacs自带cedet,所以安装是先要删除掉;2、还有就是,需要先安装好cedet,才能安装ecb。具体步骤请参考:Emacs中文网。(根据这
阅读全文
摘要:从会敲代码开始,我们就知道编译器的重要性,没有这东西,我们的代码就是一堆字符而已。而编译器编译程序的步骤主要有四个——预处理、编译、汇编和链接,最后得到可执行的目标文件。四个步骤各自的工作会是怎么样的呢?不知为何,对这个东西有了点兴趣。以GCC为例,主要工作是这样的:预处理阶段会调用cpp,编译阶段会调用cc得到汇编程序,汇编阶段调用as得到目标代码,链接时调用链接程序ld 得到可执行文件。由于四个步骤(其实本质上就是四个可执行代码)早就被编译器打包,一并替我们打理了,我们的工作是轻松了,对于这几个过程究竟是怎样进行的,恐怕还是有个问号在脑中打转。后面3个阶段的具体工作机制,我没有深入了解过,
阅读全文
摘要:虽然可以在windows的CMD下用gcc/g++编译代码了,可是CMD的字体是在是难以让我忍受。没有任何歧视心态,就是觉得没有美感,心理感觉不爽。由于CMD使用的是中文代码页(936),所以可通过“属性”修改的字体只有那难看两种字体。如果在CMD窗口中执行“chcp 437”,可以看到可更换的字体中多了Consolas和Lucida console两种字体。这两种字体虽然没有难看了,但并不是我最喜欢的。Linux终端中的默认字体是Momospace的,所以想把CMD也换成这种字体。经过百度,得到了解决方案,记录如下。1、当然,首先得下个Bitstream Vera Sans Mono的安装包
阅读全文
摘要:即使在windows下,也可以像linux一样使用gcc/g++这样优秀的编译器。晚上闲得无聊,突然看到Windows的CMD也可以编译C/C++程序,就像Linux下的超级终端一样,通过命令行使用gcc/g++编译器来编译C/C++代码。这是我从Larry Ullman的C++ PROGRAMING一书上看到的。还是记录一下,说不定以后无聊时可以拿来玩玩。网上有一些关于通过设置环境变量,使用VS的编译器来编译代码的。但是,个人觉得VS太巨大了,所以装了个DEV C++来依葫芦画瓢试试看(使用命令行编译程序的前提是有装了编译器)。装好IDE之后,即可设置环境变量(新建用户变量即可)。我的安装路
阅读全文