![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C/C++
文章平均质量分 64
ctthuangcheng
这个作者很懒,什么都没留下…
展开
-
预处理指令--C语言
ANSI标准C还定义了如下几个宏:__LINE__ 表示正在编译的文件的行号__FILE__ 表示正在编译的文件的名字__DATE__ 表示编译时刻的日期字符串,例如:“25 Dec 2014”__TIME__ 表示编译时刻的时间字符串,例如:“12:30:55”__STDC__ 判断该文件是不是定义成标准C程序 如果编译器不是标准的,则可能仅支持以上宏的一部分,或根本不支持。当然编译器也有原创 2015-03-03 11:32:07 · 1269 阅读 · 0 评论 -
C语言的预编译
由“源代码”到“可执行文件”的过程包括四个步骤:预编译、编译、汇编、链接。所以,首先就应该清楚的首要问题就是:预编译只是对程序的文本起作用,换句话说就是,预编译阶段仅仅对源代码的单词进行变换,而不是对程序中的变量、函数等。 预编译指令的基本知识不作详细介绍,只稍作汇总,重点是后面的我能想到的 使用时的注意事项。1. 基本内容预编译指令基本分类如下类别指令预定义符号__FILE__、_原创 2013-07-03 09:59:22 · 1500 阅读 · 0 评论 -
C语言中标识符的作用域、命名空间、链接属性、生命周期、存储类型
Technorati 标签: C,标识符,作用域,命名空间,链接属性,生命周期,存储类型,scope,name space,linkage,storage durations,lifetime 无论学习哪一种语言,都免不了要讨论这些问题。而且这些问题,深究起来有时也让我们很迷惑。 标识符的定义无需多讲,只需注意不仅仅是指变量,还有函数,标签等。1. 标识符的作用域原创 2013-07-03 09:25:46 · 1675 阅读 · 0 评论 -
C++ Primer 有感(管理类的指针成员)
C++类的指针成员与其他成员有所不同,指针成员指向一个内存地址,该地址的内存需要我没管理。我现在分析一下为什么要管理指针成员。有如下Student类,Student.h如下:[cpp] view plaincopyclass Student { public: Student(int *books); virtual ~Student(); int *book原创 2013-07-03 13:03:50 · 1327 阅读 · 0 评论 -
C语言的布尔类型(_Bool)
也许很多人都和我一样,不知道现在的C语言已经有了布尔型:从C99标准开始,类型名字为“_Bool”。 在此之前的C语言中,使用整型int来表示真假。在输入时:使用非零值表示真;零值表示假。在输出时:真的结果是1,假的结果是0;(这里我所说的“输入”,意思是:当在一个需要布尔值的地方,也就是其它类型转化为布尔类型时,比如 if 条件判断中的的条件;“输出”的意思是:程序的逻辑表达式返回原创 2013-07-03 09:56:15 · 2093 阅读 · 0 评论 -
C语言有关指针的变量声明中的几个易错点
Technorati 标签: 指针,typedef,const,define 我们都知道,至少听说过指针对于C语言中的重要意义,但是在使用指针时却常常让我们痛不欲生,这里有几个在声明指针有关的变量时易错的地方。1. int* 和 int * (注意空格的位置) 对于单变量声明,即一条语句中只声明一个指针变量的情况,没有区别;原因是C语言允许形式的自由性。即以下两种声原创 2013-07-03 09:37:55 · 1403 阅读 · 0 评论 -
常见排序算法
索引1. 插入排序 1.1 直接插入 1.2 折半插入 1.3 希尔排序 2. 交换排序 2.1 冒泡排序 2.2 快速排序 3. 选择排序 3.1 直接选择 3.2 堆排序 4. 归并排序 4.1 迭代归并 总结 1. 插入排序 思想:每步将一个待排序的对象, 按其排序码大小, 插入到前面已经排好序的一组对象的适当位置上,转载 2013-07-03 08:59:38 · 1848 阅读 · 0 评论 -
C++ Primer 有感(异常处理)(三)
先看下面的代码:[cpp] view plaincopyint main() { int *i=new int(10); /* 这中间的代码出现异常 */ delete i; return 0; } 如果出现了这样的情况,动态分配的内存就不会被释放。为了处理这样的问题,可以使用C++标准库auto_ptr类。如果原创 2013-07-02 17:33:12 · 1339 阅读 · 0 评论 -
C++ Primer 有感(异常处理)
1.异常是通过抛出对象而引发的。该对象的类型决定应该激活哪个处理代码。被选中的处理代码是调用链中与该对象类型匹配且离抛出异常位置最近的那个。2.执行throw的时候,不会执行跟在throw后面的语句,而是将控制从throw转移到匹配的catch,该catch可以是同一函数中局部的catch,也可以在直接或间接调用发生异常的函数的另一个函数中。控制从一个地方传到另一地方,这有两个重要含义: (1)原创 2013-07-02 11:17:15 · 1500 阅读 · 0 评论 -
C++ Primer 有感(多重继承与虚继承)
1.多重继承的构造次序:基类构造函数按照基类构造函数在类派生列表中的出现次序调用,构造函数调用次序既不受构造函数初始化列表中出现的基类的影响,也不受基类在构造函数初始化列表中的出现次序的影响。2.在单个基类情况下,派生类的指针或引用可以自动转换为基类的指针或引用,对于多重继承也是如此,派生类的指针或引用可以转换为其任意基类的指针或引用。3.多重继承像单继承一样,用基类的指针或引用只能访问基类中定义原创 2013-07-01 14:53:51 · 1800 阅读 · 0 评论 -
C++ Primer 有感(命名的强制类型转换)
C++四种强制类型转换的方法以及其应用场合,之前有看过这个知识点,但是,面试的时候怎么想也就没有写的很全面,于是,这里整理一下: C++中的四种强制类型转换除了具有C语言强制类型转换的功能外,还可提供更好的控制强制转换的过程;能更清晰地表明程序员的意图,程序员只有看到这样的代码,立即就能知道一个强制类型转换的目的。 C风格的强制类型转换(Type Cast)很简单,不管什么类型的转换原创 2013-06-26 17:54:20 · 1506 阅读 · 0 评论 -
C++在单继承、多继承、虚继承时,构造函数、复制构造函数、赋值操作符、析构函数的执行顺序和执行内容
一、本文目的与说明 1. 本文目的:理清在各种继承时,构造函数、复制构造函数、赋值操作符、析构函数的执行顺序和执行内容。 2. 说明:虽然复制构造函数属于构造函数的一种,有共同的地方,但是也具有一定的特殊性,所以在总结它的性质时将它单独列出来了。 3. 单继承、多继承、虚继承,既然都属于继承,那么虽然有一定的区别,但还是相同点比较多。如果放在一块讲,但为了将内容制作成递进的,就分原创 2013-07-03 08:57:05 · 1877 阅读 · 0 评论 -
C++ Primer 有感(标准库vector及迭代器)
vector是同一种对象的集合,每个对象都有一个对应的整数索引值。和string对象一样,标准库将负责管理与存储元素相关的类存。引入头文件#include1.vector对象的定义和初始化[cpp] view plaincopyvector v1 vector保存类型为T的对象。默认构造函数,v1为空 vector v2(v1) v2是v1的一个副本 v原创 2013-07-03 12:58:02 · 1321 阅读 · 0 评论 -
C++ Primer 有感(标准库map类型)
map是键-值对的集合。map类型通常可以理解为关联数组:可以使用键作为下标获取一个值,正如内置数组一样。而关联的本质在于元素的值于某个特定的键相关联,而并非通过元素在数组中的位置获取。1.map对象的定义要使用map对象,则必须包含map头文件。在定义map对象时,必须分别指明键和值得类型map word_count; string为键,int为值map的构造函数map m;原创 2013-07-03 12:53:44 · 1395 阅读 · 0 评论 -
C++ Primer 有感(异常处理)(四)
查看普通函数的声明的时候,不可能知道该函数会抛出什么异常,但是在捕获异常的时候要知道一个函数会抛出什么样的异常,以便捕获异常。异常说明:指定,如果函数抛出异常,抛出的异常将是包含在该说明中的一种,或者是从列出的异常中派生的类型。1.定义异常说明异常说明跟在形参表后。一个异常说明在关键字throw之后跟着一个由圆括号括住的形参列表,该列表可能为空或者多个,若为多个,则用逗号分开。例如:void ge原创 2013-07-02 17:34:14 · 1188 阅读 · 0 评论 -
C++ Primer 有感(异常处理)(二)
异常就是运行时出现的不正常,例如运行时耗尽了内存或遇到意外的非法输入。异常存在于程序的正常功能之外,并要求程序立即处理。不能不处理异常,异常是足够重要的,使程序不能继续正常执行的事件。如果找不到匹配的catch,程序就调用库函数terminate。 如果不处理异常将会出现上图的效果。下面是处理异常的代码:[cpp] view plaincopy#include using namespace s原创 2013-07-02 16:34:14 · 1431 阅读 · 0 评论 -
char能表示(-128~127)
char 的取值范围是 -128 ~127 由于-128的原码用8位无法表示,所以必须扩展到16位去表示,然后对16位的原码计算出16位的反码和补码,最后对16位的补码作低8位的截断,截断的低8位的值就是-128的补码了。// 8位所能表示的 原码 的范围-127到+127// 8位所能表示的 反码 的范围-127到+127// 8位所能表示的 补码 的范围-128到+127原创 2013-08-04 21:19:25 · 1989 阅读 · 1 评论 -
C++ Primer 有感(顺序容器)
1.顺序容器的元素排列次序与元素的值无关,而是由元素添加到容器里的次序决定。2.顺序容器 vector 支持快速随机访问 list 支持快速插入/删除 deque 双端队列顺序容器适配器 stack原创 2013-06-28 11:01:26 · 2199 阅读 · 0 评论 -
C++ Primer 有感(命名空间)
1.原创 2013-07-03 11:12:38 · 1886 阅读 · 0 评论 -
拼音输入法实现
拼音输入法实现:#include #include #include struct PY_index { char *PY; char *PY_mb; }; //"拼音输入法汉字排列表,码表(mb)" char PY_mb_a[] ={"阿啊"}; char PY_mb_ai[] ={"哎哀唉埃挨皑癌矮蔼艾爱隘碍"}; char PY_原创 2014-07-02 17:14:27 · 11693 阅读 · 1 评论 -
ARM C C++内存对齐
ARM 系列处理器是 RISC (Reducded Instruction Set Computing)处理器。很多基于ARM的高效代码的程序设计策略都源于RISC 处理器。和很多 RISC 处理器一样,ARM 系列处理器的内存访问,也要求数据对齐,即存取“字(Word)”数据时要求四字节对齐,地址的bits[1:0]==0b00;存取“半字(Halfwords)”时要求两字节对齐,地址的bit[转载 2014-05-27 14:52:20 · 2321 阅读 · 1 评论 -
sizeof(结构体)和内存对齐以及位域
Win32平台下的微软C编译器(cl.exe for 80×86)的对齐策略:1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;备注:编译器在给结构体开辟空间时,首先找到结构体中最宽的基本数据类型,然后寻找内存地址能被该基本数据类型所整除的位置,作为结构体的首地址。将这个最宽的基本数据类型的大小作为上面介绍的对齐模数。2) 结构体每个成员相对于结构体首地址的偏移量(offset)都是成原创 2014-04-25 11:23:11 · 2233 阅读 · 0 评论 -
C++ 虚函数表 多重继承
上次研究的是单继承的情况,这次研究多重继承下的虚函数表的排列情况。 这次A,A1,A2,B这几个类的继承关系如下图: 各个类的声明如下:原创 2014-04-23 00:09:08 · 2284 阅读 · 0 评论 -
C++ 虚函数表 单继承
本文研究单继承情况下,c++对象的虚函数表的具体情况。 假设有两个类A,B, 其中B由A派生出来,A含有虚函数fun1,B含有虚函数fun2。原创 2014-04-22 23:35:41 · 1409 阅读 · 0 评论 -
私有继承
在C++编程语言中,在声明一个派生类时将基类的继承方式指定为private的称为私有继承,用私有继承方式建立的派生类称为私有派生类(private derived class),其基类称为私有基类(private base class)。私有基类的公用成员和保护成员在私有派生类中的访问属性相当于派生类中的私有成员,即派生类的成员函数能访问它们,而在派生类外不能访问它们。私有基类的私有成员在派生类中原创 2014-04-22 10:36:22 · 1353 阅读 · 0 评论 -
内联函数和宏定义的区别
两者区别如下:内联函数在编译器时展开,宏在预编译原创 2014-04-17 22:47:22 · 1337 阅读 · 0 评论 -
#pragma pack(x) CPU对齐
编译器会尽量把成员对齐以提高内存的命中率。对齐是可以更改的,sh原创 2014-04-17 21:49:40 · 1439 阅读 · 0 评论 -
C++ 中const作用
一、对const与#define的特点及区别的理解#define只是用来做文本替换的,#define常量的生命周期止于编译期,它存在于程序的代码段,在实际程序中它只是一个常数,一个命令中的参数,并没有实际的存在。const常量存在于程序的数据段,并在堆栈中分配了空间。const常量是一个Run-Time的概念,它在程序中确确实实存在着并可以被调用、传递。const常量有数据类型,而宏常量没有数据类原创 2014-04-16 23:05:33 · 1516 阅读 · 0 评论 -
static 变量(静态变量)
在C++的面向对象编程中,static还可以加原创 2014-04-17 00:15:08 · 1355 阅读 · 0 评论 -
如何连接宏参数
#include#define CONS(a,b) (int)(a##e##b)#define STR(s) #sint main(){ printf(STR(huawei)); printf("\n"); printf("%d\n",CONS(2,3)); return 0;}原创 2014-04-16 22:09:34 · 1398 阅读 · 0 评论 -
C++语言编译系统提供的内部数据类型的自动隐式转换
C++语言编译系统提供的内部数据类型的自动隐式转换规则rxi原创 2014-04-16 13:31:28 · 1330 阅读 · 0 评论 -
main函数之后的调用
main函数代表进程的主线程。程序开始zh原创 2014-04-16 18:53:01 · 2287 阅读 · 0 评论 -
Eclipse开发C/C++ 安装配置
1. jdk环境配置2. eclipse 下载3. MinGW 下载安装4. 编写Hello Wordjdk环境配置环境配置我就不多说了,网上一堆例子。只要在cmd 中运行java –version 能显示版本等信息说明安装成功。eclipse 下载 eclipse要编译c/c++只需要安装CDT插件。eclipse各种版本目录:ht原创 2013-11-27 00:22:06 · 2970 阅读 · 0 评论 -
void及void指针含义的深刻解析
PS : 很久没有做C语言开发了,很多C语言的基本功都忘记了,下面是转载的void及void指针含义的深刻解析。void的含义void即“无类型”,void *则为“无类型指针”,可以指向任何数据类型。void指针使用规范①void指针可以指向任意类型的数据,亦即可用任意数据类型的指针对void指针赋值。例如:int * pint;void *pvoid;pvoid = pint; /* 不过不转载 2013-11-01 15:07:20 · 1677 阅读 · 0 评论 -
qsort函数应用大全
七种qsort排序方法 一、对int类型数组排序 int num[100]; Sample: int cmp ( const void *a , const void *b ) { return *(int *)a - *(int *)b; } qsort(num,100,sizeof(num[0]),cmp); 二、对char类型数组排序(同int类型) char wo转载 2013-10-23 14:33:01 · 1877 阅读 · 0 评论 -
C++ Primer 有感(重载操作符)
1.用于内置类型的操作符,其含义不能改变。也不能为任何内置类型定义额外的新的操作符。(重载操作符必须具有至少一个类类型或枚举类型的操作数。这条规则强制重载操作符不能重新定义用于内置类型对象的操作符的含义)2.重载操作符,操作符的优先级、结合性或操作数数目不能改变。注意:重载操作符时使用默认实参是非法的。3.重载操作符并不保证操作数的求值顺序,不再具备短路求值特性。4.作为类成员的重载函数,其形参看原创 2013-06-30 12:58:31 · 1834 阅读 · 0 评论 -
C++ Primer 有感(复制控制)
1.不管类是否定义了自己的析构函数,编译器都 自动执行类中非static数据成员的析构函数。 2.如果我们没有定义复制构造函数,编译器就会为我们合成一个。合成复制构造函数的行为是,执行逐个成员初始化,将新对象初始化为原对象的副本。 所谓“逐个成员”,指的是编译器将现有对象的每个非static成员,依次复制到正创建的对象。合成复制构造函数直接复制内置类型成员的值,类类型成员使用该类的复制构造函原创 2013-06-30 10:27:13 · 1348 阅读 · 0 评论 -
C++ Primer 有感(标准库类型)
1.当进行string对象和字符串字面值混合连接操作时,+操作符的左右操作数必须至少有一个是string类型的:string s1= "hello"; sring s2="world"; string s3=s1 + ", "; //OK string s4 = "hello" + ","; //error string s5 = s1 + "," + "world";原创 2013-06-26 15:48:47 · 1323 阅读 · 0 评论 -
linux异步IO浅析
知道异步IO已经很久了,但是直到最近,才真正用它来解决一下实际问题(在一个CPU密集型的应用中,有一些需要处理的数据可能放在磁盘上。预先知道这些数据的位置,所以预先发起异步IO读请求。等到真正需要用到这些数据的时候,再等待异步IO完成。使用了异步IO,在发起IO请求到实际使用数据这段时间内,程序还可以继续做其他事情)。假此机会,也顺便研究了一下linux下的异步IO的实现。linux下原创 2013-05-12 01:29:59 · 2415 阅读 · 0 评论 -
记一个链接库导出函数被覆盖的问题
链接库的一个问题前些天遇到这样一个问题:libD.so需要用到libS.a提供的方法,于是静态链接了libS.a。而libS.a和libD.so又都会被可执行文件bin所链接。(因为libD.so还提供给其他可执行程序使用,所以链接libS.a是必须的。而libD.so对于bin来说是可选的,所以bin也必须链接libS.a。)这就形成下面一种情况:libD.so |原创 2013-05-12 00:27:19 · 2132 阅读 · 0 评论