
C/C++
文章平均质量分 81
雷电羊
这个作者很懒,什么都没留下…
展开
-
C 宏定义详解
我们可能要定义很多常量( 不管是放在源文件还是头文件 ),那么我们有时考虑定义某个常量时,我们就必须返回检查原来此常量是否定义,但这样做很麻烦.if defined宏正是为这种情况提供了解决方案.举个例子,如下:#define .... #define .... ........ ........ #define a 100 ....... 此时,我们要检查a是转载 2011-07-18 11:32:50 · 403 阅读 · 0 评论 -
函数参数传递->指针
(1)基础知识C课本上的一个程序:void swap(int *p1,int *p2){ int t=*p1; *p1=*p2; *p2=t;}void main(){ int a=1,b=2; swap(&a,&b); ...}a,b的值交换了是因为a,b的地址被传递给了函数swap,使得p1=&a,p2=&b。转载 2011-04-05 16:46:00 · 452 阅读 · 0 评论 -
assert断言
assert宏的原型定义在assert.h中,其作用是如果它的条件返回错误,则终止程序执行. 原型定义: 显示代码打印1 #include "assert.h" 2 void assert( int expression ); assert的作用是现计算表达式 expression ,如果其值为假(即为0),那么它先向stderr打印一条出错信息,然后通过调用原创 2011-04-05 16:50:00 · 570 阅读 · 0 评论 -
c常用宏指令
宏指令#error的用法编译过程中,一旦遇到这条宏指令,便会终止编译,读该宏指令,显示出错误信息后而停止。用法如下:#line 错误信息实例:#if !defined(__cplusplus)#error C++ compiler required.#endifWhen #error directives are encountered, com原创 2011-04-14 20:26:00 · 1233 阅读 · 0 评论 -
va_start va_end 的使用和原理
1:当无法列出传递函数的所有实参的类型和数目时,可用省略号指定参数表void foo(...);void foo(parm_list,...);2:函数参数的传递原理函数参数是以数据结构:栈的形式存取,从右至左入栈.eg:先介绍一下可变参数表的调用形式以及原理:首先是参数的内存存放格式:参数存放在内存的堆栈段中,在执行函数的时候,从最后一个开始入栈。因此栈底高地址,转载 2012-01-03 12:36:58 · 508 阅读 · 0 评论 -
详解_C语言可变参数_va_list和_vsnprintf及printf实现
<!--p {margin-bottom:0.21cm}-->C语言的变长参数在平时做开发时很少会在自己设计的接口中用到,但我们最常用的接口printf就是使用的变长参数接口,在感受到printf强大的魅力的同时,是否想挖据一下到底printf是如何实现的呢?这里我们一起来挖掘一下C语言变长参数的奥秘。先考虑这样一个问题:如果我们不使用C标准库(libc)中提供转载 2012-01-03 12:39:29 · 944 阅读 · 0 评论 -
C语言和设计模式
C语言和设计模式转载 2012-07-03 16:22:50 · 558 阅读 · 0 评论 -
内存的堆分配和栈分配 & 字符数组,字符指针,Sizeof总结
堆和栈的区别 一个由C/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其 操作方式类似于数据结构中的栈。 2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回 收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。转载 2011-04-06 15:16:00 · 628 阅读 · 0 评论 -
extern用法详解
1 基本解释 extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。 另外,extern也可用来进行链接指定。2 问题:extern 变量 在一个源文件里定义了一个数组:char a[6]; 在另外一个文件里用下列语句进行了声明:extern char *a; 请问,这样可以吗?转载 2011-04-11 13:42:00 · 550 阅读 · 0 评论 -
typedef用法
一.基本概念剖析 int* (*a[5])(int, char*); //#1void (*b[10]) (void (*)()); //#2double(*)() (*pa)[9]; //#3 1.C语言中函数声明和数组声明。函数声明一般是这样: int fun(int, double);对应函数指针(pointer to fu转载 2011-04-11 14:02:00 · 436 阅读 · 0 评论 -
dmalloc的使用
dmalloc的使用 1. what dmalloc是一种用于检查C/C++内存泄露(leak)的工具,即检查是否存在直到程序运行结束还没有释放的内存,并且能够精确指出在哪个源文件的第几行。2. download dmalloc以一个运行库的方式发布(http://dmalloc.com/releases/)。 3. install (1) tar -zvxf dmallo转载 2011-04-22 09:42:00 · 7661 阅读 · 0 评论 -
C语言之断言
每次写摘要我都觉得是一件很头疼的事儿,因为我知道摘要真的很重要,它几乎直接就决定了读者的数量。可能花了九六二虎之力写出来的东西,因为摘要的失败而前功尽弃,因为绝大多数的读者看文章之前都会浏览下摘要,如果他们发现摘要“不对口”,没有什么特色和吸引人的地方,那么轻则采用一目十行的方法看完全文,重则对文章判“死刑”,一篇文章的好坏虽然不能用摘要来衡量,但是它却常常被读者用来衡量一篇文章的好坏,从而成为了转载 2011-07-20 14:14:54 · 380 阅读 · 0 评论 -
指针的那点事
懂得C语言的人都知道,C语言之所以强大,以及其自由性,绝大部分体现在其灵活的指针运用上。因此,说指针是c语言的灵魂,一点都不为过。所以从我的标题加了个(一)也可以看出指针的重要性,我尽可能的向大家交代清楚我对于指针的理解。所以在讲解的过程中我尽可能的用代码加文字的描述方式,通过代码的分析来加深我们对于指针的理解,我给出的都是完整的代码,所以读者可以在看的过程中直接copy下去即可运行,希望下面的讲转载 2011-07-20 14:18:32 · 644 阅读 · 0 评论 -
#define
#define用法 1.简单的define定义 #define MAXTIME 1000 一个简单的MAXTIME就定义好了,它代表1000,如果在程序里面写 if(i 编译器在处理这个代码之前会对MAXTIME进行处理替换为1000。 这样的定义看起来类似于普通的常量定义CONST,但也有着不同,因为define的定义更像是转载 2011-07-25 09:32:39 · 1517 阅读 · 0 评论 -
C语言之if...else PK switch...case
在学校学C的那会儿,就已经知道switch...case的执行效率要相对if...else较高了(大体上讲),因为从字面上和逻辑上看,switch...case是不用像if...else那样做一系列比较判断就可以直接定位到相应的条件分支的。不过也没有深究过其中的原理。后来由于一偶然原因,就明白了其中的细节。今日碰巧看到一篇blog,是讲作者对此问题的思考,我觉得作者的理解大体上都是对的,不过下面跟转载 2011-07-27 09:19:44 · 721 阅读 · 0 评论 -
i++循环与i--循环的执行效率
昨天同事问了我一个问题,有两个循环语句:for(i = n; i > 0; i–){…}for(i = 0; i {…}为什么前者比后者快?我当时的解释是:i–操作本身会影响CPSR(当前程序状态寄存器),CPSR常见的标志有N(结果为负), Z(结果为0),C(有进位),O(有溢出)。i > 0,可以直接通过Z标志判断出来。i++操作也会影响CPS转载 2011-07-29 16:14:21 · 449 阅读 · 0 评论 -
检查新同事的代码时发现的问题
检查新同事的代码时发现的问题 今天看了一个组员的代码,他是今年才毕业的。在应届毕业生中,他的能力算是相当不错的了,所以我们才破格录用,并准他一个月假期回去答辩毕业论文。在他的代码中,发现几个问题,其中一些颇具代表性,把它们记下来供新手参考。 函数原型中没有参数名。比如,一个函数原型为int foo(const char*buff, size_t buff_length)的函数,他写转载 2011-07-29 16:48:23 · 566 阅读 · 0 评论 -
设计log函数库的几个要点
只要留意一下大项目的源码,你会发现,几乎无一例外的包括一个log模块。它的功能很直观:记录一些程序运行时信息,多数情况是用来辅助debug的。大项目都有一套的log的函数,在它的基础上开发,调用它提供的Log函数就行了,比如linux内核、apache等。也有开源log函数库,可以直接拿过用。这里,我们并不鼓励重新发明轮子,但在少数情况下,确实不得不编写自己的log函数。下面是对以前的经验的总结,转载 2011-07-29 16:49:42 · 757 阅读 · 0 评论 -
malloc()和free()
一、malloc()和free()的基本概念以及基本用法:1、函数原型及说明:void *malloc(long NumBytes):该函数分配了NumBytes个字节,并返回了指向这块内存的指针。如果分配失败,则返回一个空指针(NULL)。关于分配失败的原因,应该有多种,比如说空间不足就是一种。void free(void *FirstByte): 该函数是将之前转载 2011-10-18 14:24:27 · 415 阅读 · 0 评论 -
深入理解C语言
深入理解C语言导读:Dennis Ritchie过世了,他发明了C语言,一个影响深远并彻底改变世界的计算机语言。一门经历40多年的到今天还长盛不训的语言,今天很多语言都受到C的影响,C++,Java,C#,Perl,PHP,Javascript等等。但是,你对C了解吗?相信你看过本站的《C语言的谜题》还有《谁说C语言很简单?》。这里,我再写一篇关于深入理解C语言的文章,一方面是缅怀Denn转载 2011-11-05 15:26:03 · 389 阅读 · 0 评论 -
可重入函数
可重入函数主要用于多任务环境中,一个可重入的函数简单来说就是可以被中断的函数,也就是说,可以在这个函数执行的任何时刻中断它,转入OS调度下去执行另外一段代码,而返回控制时不会出现什么错误;而不可重入的函数由于使用了一些系统资源,比如全局变量区,中断向量表等,所以它如果被中断的话,可能会出现问题,这类函数是不能运行在多任务环境下的。可重入函数简介 也可以这样理解,重入即表示转载 2012-01-03 12:38:22 · 439 阅读 · 0 评论 -
Arm设计思想与高效C编程
原文:http://blog.youkuaiyun.com/woshixingaaa/archive/2011/03/15/6249767.aspx一.RISC设计思想ARM内核采用RISC体系结构。RISC是一种设计思想,其目标是设计出一套能在高时钟频率下单周期执行,简单而有效的指令集。RISC的设计重点在于由硬件执行的指令的复杂度,这是因为软件比硬件容易提供更大的灵活性和更高的智能。因此,RI转载 2012-03-23 11:20:39 · 569 阅读 · 0 评论 -
sscanf函数的高级用法
原文转载时请注明出处:http://blog.youkuaiyun.com/absurd/ 大家都知道sscanf是一个很好用的函数,利用它可以从字符串中取出整数、浮点数和字符串等等。它的使用方法简单,特别对于整数和浮点数来说。但新手可能并不知道处理字符串时的一些高级用法,这里做个简要说明吧。 1. 常见用法。charstr[512] = {0};转载 2012-06-29 11:27:59 · 403 阅读 · 0 评论 -
C语言 内存中结构体字节对齐
原文一、字节对齐作用和原因:对齐的作用和原因:各个硬件平台对存储空间的处理上有很大的不同。一些平台对某些特定类型的数据只能从某些特定地址开始存取。比如有些架构的CPU在访问一个没有进行对齐的变量的时候会发生错误,那么在这种架构下编程必须保证字节对齐,其他平台可能没有这种情况,但是最常见的是如果不按照适合其平台要求对数据存放进行对齐,会在存取效率上带来损失。比如有些平台每次读都是从偶地址转载 2012-08-21 10:07:49 · 706 阅读 · 0 评论 -
枚举
http://blog.youkuaiyun.com/xxxsz/article/details/7473341用法一:常量在JDK1.5之前,我们定义常量都是:public static fianl....。现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法。 Java代码 public enum Color { RED,转载 2012-08-22 13:43:50 · 399 阅读 · 0 评论 -
递归实现倒序打印
//递归实现倒序打印 #include #define LEN 3 char buf[LEN]={'a', 'b', 'c'}; void print_backward(int pos) { if(pos == LEN) return; print_backward(pos+1); putchar(buf[pos]);转载 2012-08-22 16:10:39 · 1145 阅读 · 0 评论 -
Linux 线程同步---条件变量
http://blog.youkuaiyun.com/hiflower/article/details/21953501. 相关函数 #include pthread_cond_t cond =转载 2012-08-24 16:56:53 · 461 阅读 · 0 评论 -
memcpy()、 memmove()和memccpy()
http://hi.baidu.com/zengzhaonong/item/32c06a3e70f5cb0eceb9fe2dmemmove() -- 拷贝内存内容相关函数: bcopy(), memccpy(), memcpy(), strcpy(), strncpy()表头文件: #include 定义函数: void *memmove(void *dest,转载 2012-09-04 13:17:47 · 480 阅读 · 0 评论 -
详解大端模式和小端模式
http://blog.youkuaiyun.com/ce123/article/details/6971544详解大端模式和小端模式一、大端模式和小端模式的起源 关于大端小端名词的由来,有一个有趣的故事,来自于Jonathan Swift的《格利佛游记》:Lilliput和Blefuscu这两个强国在过去的36个月中一直在苦战。战争的原因:大家都知道,吃鸡蛋的时候,原始的方法是转载 2012-09-04 13:54:16 · 630 阅读 · 0 评论 -
strcpy函数与memcpy函数
http://blog.youkuaiyun.com/lincyang/article/details/5736641strcpy函数与memcpy函数strcpy和memcpy都是标准C库函数,它们有下面的特点。strcpy提供了字符串的复制。即strcpy只用于字符串复制,并且它不仅复制字符串内容之外,还会复制字符串的结束符。memcpy提供了一般内存的复制。即memc转载 2012-09-04 10:35:12 · 563 阅读 · 0 评论 -
Volatile关键字详解
http://blog.youkuaiyun.com/yinjiabin/article/details/7231447volatile提醒编译器它后面所定义的变量随时都有可能改变,因此编译后的程序每次需要存储或读取这个变量的时候,都会直接从变量地址中读取数据。如果没有volatile关键字,则编译器可能优化读取和存储,可能暂时使用寄存器中的值,如果这个变量由别的程序更新了的话,将出现不一致的现象。转载 2012-09-05 10:30:12 · 939 阅读 · 0 评论 -
malloc (0)详解
http://blog.youkuaiyun.com/yinjiabin/article/details/7231728问题:char* ptr = malloc(0*sizeof(char));if(NULL == ptr) printf("got a NULL pointer");else printf("got a Valid pointer");请问:转载 2012-09-05 10:28:46 · 439 阅读 · 0 评论 -
迅雷C++试题及解答
原文1.下列程序的输出结果为:(B)#includevoid main(){ char* a[ ] = { "hello", "the", "world"}; char** pa = a; pa++; cout}A) theworld B) the C) ello D) ellotheworld转载 2012-05-24 10:37:38 · 740 阅读 · 0 评论 -
编写易于理解代码的六种方式
http://www.ibm.com/developerworks/cn/linux/l-clear-code/index.html简介: 对于一名开发人员,时间是最宝贵的资源。本文所要介绍的这六种编写可维护代码的方法可以保证让您节省时间和少受挫折:在编写注释上多花一分钟,会让您少受一小时研读代码的痛苦折磨。我学习编写、改善和维护代码的过程是很艰苦的。在过去的 12 年里,我一转载 2012-09-06 15:18:46 · 1047 阅读 · 0 评论 -
深入浅出VA函数
http://www.ibm.com/developerworks/cn/linux/l-va/index.html简介: 本文主要介绍可变参数的函数使用,然后分析它的原理,程序员自己如何对它们实现和封装,最后是可能会出现的问题和避免措施。VA函数(variable argument function),参数个数可变函数,又称可变参数函数。C/C++编程中,系统提供给编程人员的转载 2012-09-06 15:24:46 · 629 阅读 · 0 评论 -
技巧:在 C/C++中如何构造通用的对象链表
http://www.ibm.com/developerworks/cn/linux/l-tip-prompt/tip02/简介: 您是否做过这样一个项目,它要求您在内存中保存数目不定的若干不同对象?对于某些情况,二叉树是最佳选择,但在通常情况下,更简单的链表是显而易见的选择。一个简化的问题示例链表的难点在于必须复制链表处理函数来处理不同的对象,即便逻辑是完全相同的。例如:转载 2012-09-06 15:04:23 · 828 阅读 · 0 评论 -
使用可重入函数进行更安全的信号处理
http://www.ibm.com/developerworks/cn/linux/l-reent.html简介: 如果要对函数进行并发访问,不管是通过线程还是通过进程,您都可能会遇到函数不可重入所导致的问题。在本文中,通过示例代码了解如果可重入性不能得到保证会产生何种异常,尤其要注意信号。引入了五条可取的编程经验,并对提出的编译器模型进行了讨论,在这个模型中,可重入性由编译器前端处理。转载 2012-09-06 15:52:57 · 452 阅读 · 0 评论 -
用 Eclipse 平台进行 C/C++ 开发
http://www.ibm.com/developerworks/cn/linux/opensource/os-ecc/简介: 我们将概述如何在 C/C++ 开发项目中使用 Eclipse 平台。尽管 Eclipse 主要是一个 Java 开发环境,但其体系结构确保了对其它编程语言的支持。在本文中,您将学习如何使用 C/C++ 开发工具箱(C/C++ Development Toolki转载 2012-09-06 16:16:22 · 1075 阅读 · 0 评论 -
C 编程最佳实践
http://www.ibm.com/developerworks/cn/linux/l-bppc/简介: 尽管 C 语言问世已近 30 年,但它的魅力仍未减退。C 语言继续吸引着众多的人们,他们为了编写新的应用程序,或者移植或维护现有的应用程序而必须学习新技能。简介本文是为了满足开发人员的需要而写的。我们总结了一套指南,无论作为开发人员还是顾问,这些指南多年来一直都很好地转载 2012-09-06 14:03:37 · 779 阅读 · 0 评论 -
自我管理数据缓冲区内存
http://www.ibm.com/developerworks/cn/linux/wa-memmng/index.html简介: C 程序设计语言定义了两个标准的内存管理函数:malloc() 和 free()。C 程序员经常使用那些函数在运行时分配缓冲区,以便在函数之间传递数据。然而在许多场合下,您无法预先确定缓冲区所需的实际大小,这对于构造复杂的 C 程序来说,可能会导致几个根本性转载 2012-09-06 15:57:27 · 424 阅读 · 0 评论