C/C++
wenchao126
这个作者很懒,什么都没留下…
展开
-
宏定义之“#”
C语言中的宏定义的普通用法在此不举,但就宏定义的“#”用法作此总结,1、#define GEEK(p) if(!p){ printf(“warning ”#p“ failed”);return;}对上面的例子中“#p”,这个用法不常用,其作用是将p两边加上双引号,就是将宏替换之后的标识符加上引号,如果不如此的话,printf不好显示p2、见过上面的#p,其实宏定义还支持“##”,两原创 2012-04-17 23:48:33 · 1214 阅读 · 0 评论 -
砝码称重问题
问题:12个砝码中只有一个重量不同于其它的,但不知是重还是轻,只用三次天平,找出它! 这道题就是考验大家考虑问题是否全面,当然附加了一点急转弯。下面是分析过程 我们标识12个砝码为1,2,3,4,5,6,7,8,A,B,C,D; 取8个砝码置于天平两边,1,2,3,4 --- 5,6,7,8; if(1,2,3,4 == 5,6,7,8)原创 2012-10-18 16:38:57 · 1584 阅读 · 0 评论 -
元芳,你知道公元一年一月一日是星期几吗
公元一年一月一日为星期一。这是标准定义,至于为什么这么定义,你可以去考证一下。 我们现在采用的立法是罗马教皇格里高利十三世修订“儒略历”所成的“格里历”,该历法规定自1582年10月4日次日为1582年10月15日,于是历史上就少了10天。 儒略历是古罗马的恺撒大帝和在公元前46年制定的,365年作为一年,单月为大月31天,双月为小月30天,2月29天。4年一闰,称为“儒略历”原创 2012-10-19 16:18:52 · 14391 阅读 · 1 评论 -
排序算法
一、 首先说明一个几个概念 1) 如果待排序列中有两个相同的关键字 Ki = Kj,其顺序是Ki在Kj之前。如果经过排序之后,Ki 和 Kj的顺序颠倒了,则说明这个排序方法是不稳定的。否则则是稳定排序。 2)在内存中就可以完成的排序过程,称为内部排序。如果待排数据量很大,内存不够容纳全部数据,在排序过程中必须对外存进行访问,则叫做外部排序。二、排序算原创 2012-10-23 14:36:50 · 671 阅读 · 0 评论 -
C语言的谜题
这几天,本站推出了几篇关于C语言的文章如下所示: 语言的歧义 [酷壳链接] [CSDN链接]谁说C语言很简单? [酷壳链接] [CSDN链接]6个变态的C语言Hello World程序 [酷壳链接] [CSDN链接]如何加密/弄乱C源代码 [酷壳链接] [CSDN链接]C语言的谜题 [酷壳链接] [CSDN链接]我们可以看到很多C语言相关的一些东西。比如《语言的歧义》主要告诉了大家C语转载 2012-11-23 20:16:42 · 410 阅读 · 0 评论 -
murmurhash2和djb
两个hash算法1、djb算法 /* the famous DJB Hash Function for strings */ unsigned int DJBHash(char *str) { unsigned int hash = 5381; while (*str){转载 2012-12-21 18:06:58 · 9508 阅读 · 0 评论 -
__attribute__机制介绍
1. __attribute__ GNU C的一大特色(却不被初学者所知)就是__attribute__机制。__attribute__可以设置函数属性(Function Attribute)、变量属性(Variable Attribute)和类型属性(Type Attribute)__attribute__前后都有两个下划线,并且后面会紧跟一对原括弧,括弧里面是相应的__attrib转载 2013-01-05 09:51:14 · 728 阅读 · 0 评论 -
函数的可重入性理解
最近,项目要求可能需要做博通的交换芯片的驱动程序,涉及到多用户同时进行操作,和大量的数据处理,因此在进行代码架构的时候需要进行前期简单的验证设计。考虑到一点就是程序设计的可重入性。经过简单的搜索,在维基百科和其他朋友的帖子里找到了相关概念。为了帮助自己今后理解,特地将此概念加上自己的理解整理在此。一、维基百科解释 1 若一个程序或子程序可以安全的被并行执行,则称其为可重入(reen转载 2013-01-05 10:23:19 · 4318 阅读 · 0 评论 -
__builtin_expect详解
在GTK+2.0源码中有很多这样的宏:G_LIKELY和G_UNLIKELY。比如下面这段代码:if (G_LIKELY (acat == 1)) /* allocate through magazine layer */ { ThreadMemory *tmem = thread_memory_from_self(); guint ix =转载 2013-01-06 15:10:27 · 579 阅读 · 0 评论 -
linux中container_of
linux中container_of(ptr, type, member)宏的作用是传入结构体类型type的域member地址ptr,返回该结构体变量的首地址,定义如下:#define container_of(ptr, type, member) ({ \ const typeof( ((type *)0)->member ) *__mptr = (ptr); \转载 2013-01-06 15:12:15 · 435 阅读 · 0 评论 -
常见的数组问题
1、给定一个含有n个元素的整型数组a,求a中所有元素的和。(要求采用递归的方式,一行代码) 参考答案:#includeint sum(int* a,int n);int main(){ int array[5] = {1,2,3,4,5}; int summer; summer = sum(array,sizeof(array)/sizeof(a原创 2012-10-17 17:40:16 · 2414 阅读 · 0 评论 -
在ubuntu环境下redis开发
1、下载redis wgethttp://redis.googlecode.com/files/redis-2.4.17.tar.gz tar -zvxf redis-2.4.17.tar.gz cd redis-2.4.17 make sudo make install 2、安装hiredis原创 2012-09-25 11:38:13 · 9430 阅读 · 2 评论 -
宏定义之do-while(0)
如是:在很多时候我们会用到宏定义,但对其中的技巧用的多总结的少,比如在宏定义中使用do-while语句。 #define dictSetHashVal(d, entry, _val_) do { \ if ((d)->type->valDup) \ entry->val = (d)->type->valDup((d)->pr原创 2012-05-03 12:11:41 · 2012 阅读 · 0 评论 -
约瑟夫循环问题的解答
约瑟夫环问题(Josephus) 原题: 用户输入M,N值,从1至N开始顺序循环数数,每数到M输出该数值,直至全部输出。写出C程序。(约瑟夫环问题 Josephus) 提示: 由于当某个人退出圆圈后,报数的工作要从下一个人开始继续,剩下的人仍然是围成一个圆圈的,可以使用循环表,由于退出圆圈的工作对应着表中结点的删除操作,对于这种删除操作频繁原创 2012-09-02 15:50:47 · 1290 阅读 · 0 评论 -
C++之sstream
经常会遇到格式转换的操作,在C++中可以采用stringstream来进行转换,这种操作还是比较方便的直观的,记录一点使用心得, 1、支持int、char* string、bool -- > int之间的格式转换; 2、使用stringstream来做转换时,最好使用完,进行ss.clear()操作; 推荐阅读这个链接http://www.cp原创 2012-08-30 17:36:22 · 4829 阅读 · 0 评论 -
结构体成员偏移量的计算
一、先来一段理论知识 ANSI C标准允许任何值为0的常量被强制转换成任何一种类型的指针,并且转换结果是一个NULL指针,因此((s*)0)的结果就是一个类型为s*的NULL指针。如果利用这个NULL指针来访问s的成员当然是非法的,但&(((s*)0)->m)的意图并非想存取s字段内容,而仅仅是计算当结构体实例的首址为((s*)0)时m字段的地址。聪明的编译器根本就不生成访问原创 2012-09-04 09:54:25 · 6087 阅读 · 0 评论 -
window环境下glog的使用
先下载glog最新版,解压里面有*sln文件,如果你安装了VS2005以上版本都可以直接打开,编译即可得到libglog.dll和libglog.lib文件,拷贝文件到你的测试文件夹下,并拷贝src\windows\下的glog目录到你的工程文件下。 如下是一个测试代码, #include "glog/logging.h" #include #incl原创 2012-09-04 09:16:00 · 9445 阅读 · 1 评论 -
exec函数用法总结
在使用exec函数族的时候,经常搞不清楚这六个函数之间的区别,下面就总结一下这六个函数的区别。 #include int execl(const char *path, const char *arg, ...);int execlp(const char *file, const char *arg, ...);int execle(const char *path,原创 2012-09-07 17:53:51 · 8253 阅读 · 0 评论 -
ubuntu环境下libxml2的测试
一、创建一个xml文件 #include #include "libxml/parser.h"#include "libxml/tree.h"int main(){ xmlDocPtr doc = NULL; xmlNodePtr root_node = NULL,node = NULL,node1 = NULL; doc = xmlNewDoc(BA原创 2012-09-27 17:05:23 · 1433 阅读 · 0 评论 -
C/C++常见问题集
1、什么是类型安全 根据查找的资料大概整理一下答案, 类型安全很大程度上可以等价于内存安全,类型安全的代码不会试图访问自己没被授权的内存区域。 有的时候也用“类型安全”形容某个程序,判别的标准在于该程序是否隐含类型错误。 2、如何保证程序的类型安全想保证程序的类型安全性,应尽量避免使用空类型指针void*,尽量不对两种类型指原创 2012-09-02 13:18:18 · 1041 阅读 · 0 评论 -
ubuntu下mysql安装
一、安装mysql 1、sudo apt-get intsall mysql-server 2、sudo apt-get install mysql-client 3、sudo apt-get install libmysqlclient-dev 二、检查一下mysql原创 2012-09-25 14:28:55 · 715 阅读 · 0 评论 -
一级指针和二级指针
今天在http://www.csdn.net/article/2013-01-10/2813559-two-star-programming看到了linus关于指针的谈论,里面的两个例子,使我对我之前理解的指针产生了怀疑,于是又认真的玩起了二级指针。 1 void remove_if(node ** head, remove_fn rm) 2 { 3 for (原创 2013-01-11 15:18:22 · 5829 阅读 · 0 评论