coding tips
RichardYSteven
这个作者很懒,什么都没留下…
展开
-
特殊格式报文的实现
The RTP header has the following format: 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+原创 2008-09-22 18:53:00 · 917 阅读 · 0 评论 -
Build Shared Library
http://www.yolinux.com/TUTORIALS/LibraryArchives-StaticAndDynamic.html How to generate a shared object: (Dynamically linked object library file.)Note that this is a two step process.原创 2009-10-16 17:44:00 · 3041 阅读 · 0 评论 -
计算循环使用的数组的index
通常我们会使用一个数组 来buffer一些数据。这个数组时循环利用的。 那么这个index 就是要计算出来的了。 这里列出一个比较快的方法。 /* modulo inc/dec, bound = 2^k */#define MODDEC_POW2(x, bound) (((x) - 1) & ((bound) - 1))#define MODINC_POW2(x, bo原创 2009-11-18 10:54:00 · 1180 阅读 · 0 评论 -
自己写的 container_of & offset_of 的原理
struct A{ int c; char b;} a_st;int main(){ char* t = &a_st.b; a_st.c = 9; struct A* pA = (struct A*)((char*)t - &((struct A*)(0))->b); pr原创 2009-11-21 11:54:00 · 1000 阅读 · 0 评论 -
Inline ASM code to get current $ra and $sp on MIPS
//Inline ASM code to get current $ra and $sp __asm__ __volatile__ ( " move %0, $ra/n" " move %1, $sp/n" : "=r"(ra), "=r"(sp) ); 意思和x86的差不多。 呵呵原创 2010-04-16 00:15:00 · 1555 阅读 · 0 评论 -
C的0长数组
<br />http://hi.baidu.com/bmrs/blog/item/83561e00605c13db267fb555.html<br /> <br />#include <stdio.h><br />#include <stdlib.h><br />#include <string.h><br /><br />char buf[128];<br />struct Test{<br /> int len;<br /> char content[0];<br /转载 2010-12-13 11:55:00 · 1228 阅读 · 0 评论 -
数据结构对齐, #pragma pack 和 __attribute__((packed))
<br />gcc中定义了两个修改数据结构对齐方式的语句<br />1. #pragma pack()<br />2. __attribute__((packed))<br /> <br />#include <stdio.h><br />#include <stdlib.h><br />#include <string.h><br /><br />// calculate the offset of t in S<br />#define offsetof(S,t) (size_t原创 2010-12-13 13:39:00 · 4196 阅读 · 0 评论 -
dlopen与动态链接库的依赖
<br />有两个动态链接库,其中一个依赖了另一个定义的函数,使用dlopen的时候,需要加上RTLD_GLOBAL。<br /> <br />动态库一,life,定义了一个life函数。<br />gcc -shared -Wl,-soname,liblife.so.1 -o liblife.so.1.0 life.c<br />---------------------------------------------------------------------<br />#include <stdi原创 2011-01-04 17:13:00 · 10582 阅读 · 0 评论 -
dlopen与动态链接库的依赖 2
上一篇文章中讲到了 两个动态链接库,有依赖关系,在dlopen时,需要使用RTLD_GLOBAL。这样之前的symbol就可以被之后的动态库找到。这次说的是,动态链接库依赖了主程序中的symbol。 我们需要在编译时加上 -rdynamic 选项,就可以实现这个功能。原创 2011-01-05 17:53:00 · 5446 阅读 · 0 评论 -
C语言预处理中的 # 和 ## 运算符
3.#运算符出现在宏定义中的#运算符把跟在其后的参数转换成一个字符串。有时把这种用法的#称为字符串化运算符。例如:#definePASTE(n)"adhfkj"#nmain(){printf("%s/n",PASTE(15));}宏定义中的#运算符告诉预处理程序,把源代码中任何传递给该宏的参数转换成一个字符串。所以输出应该是adhfkj15。4.##运算符##运算符用于把参数连接到一起。预处理程序把出现在##两侧的参数合并成一个符号。看下面的例子:#defineNUM(a原创 2011-01-18 08:20:00 · 1734 阅读 · 1 评论 -
特殊的数组赋值
今天 2009-01-12, 又发现一个新的数组赋值方法。 int list[5][2]={ [2] = {3,4}, [0] = {3,6}, {5,7},}; printf("%d, %d, %d/n", list[0][1], list[2][1], list[1][1]); 的结果是6, 4, 7 很原创 2009-01-12 17:54:00 · 821 阅读 · 0 评论 -
Build Static Library
http://www.yolinux.com/TUTORIALS/LibraryArchives-StaticAndDynamic.html Compile: cc -Wall -c ctest1.c ctest2.c Compiler options: -Wall: include warni原创 2009-10-16 17:27:00 · 1734 阅读 · 0 评论 -
算出某个值(2^N)的整数倍数
这个题目不是很准确,先看个代码 int main(){ int a = 128; int b = 7; printf("%d /n", (b+(a-1)) & ~(a-1)); b = 128; printf("%d /n", (b+(a-1)) & ~(a-1)); b = 129; printf("%d /n",原创 2009-09-11 10:00:00 · 1097 阅读 · 0 评论 -
c中调用c++函数
http://www.research.att.com/~bs/bs_faq2.html#callCpp 将 C++ 函数声明为``extern "C"(在你的 C++ 代码里做这个声明),然后调用它(在你的 C 或者 C++ 代码里调用)。例如:// C++ code:extern "C" void f(int); void f(int i){ //原创 2009-08-18 16:07:00 · 724 阅读 · 0 评论 -
backtrace 函数的使用
#include #include #include #include /* Obtain a backtrace and print it to stdout. */voidprint_trace (void){ void *array[10]; size_t size; char **strings; size_t i;原创 2008-11-07 10:27:00 · 1886 阅读 · 0 评论 -
用数组实现有限自动机FSM
FSM的实现方法好像蛮多的, 用数组实现是比较常见的一种。 思路是这样的,用一个二维数组来保存在某个状态下遇到某种事件或激励时该执行哪个动作。二维数组中有多少“记录”就表示了状态机中有多少状态, 而“记录”中有多少栏表示了有多少种事件。 当然不是在所有的状态下,都会处理所有事件的。 有了这个概念,看代码就明白很多了。下面是个小例子,虽然不能运行,但其搭建起来的结构,却给以后的工作打原创 2009-01-12 14:33:00 · 1606 阅读 · 0 评论 -
A piece code for backtrace in MIPS
一个相关的链接 http://www.yosefk.com/blog/getting-the-call-stack-without-a-frame-pointer.html #define _SYS_UCONTEXT_H#define _BITS_SIGCONTEXT_H#include //#include #include #include #include #include #i原创 2008-11-19 14:57:00 · 4634 阅读 · 2 评论 -
POSIX message queues brief usage
Code from http://mij.oltrelinux.com/devel/unixprg/// a little error in the original version, changed a little More information on POSIX message queue http://www.linuxhowtos.org/manpages/7/mq_o转载 2008-12-12 15:31:00 · 1547 阅读 · 0 评论 -
Converting 32-bit Applications Into 64-bit Applications: Things to Consider
source is fromhttp://developers.sun.com/solaris/articles/ILP32toLP64Issues.html and http://www.unix.org/whitepapers/64bit.html there are several kind of data type mode Data Ty转载 2008-12-16 11:12:00 · 799 阅读 · 0 评论 -
mq_notify usage
Forget where find the source code. #include #include #include #include #include #include #include #define handle_error(msg) / do { perror(msg); exit(EXIT_FAILURE); } while (0)static void转载 2008-12-12 15:54:00 · 1721 阅读 · 0 评论 -
汇编和 c同步使用
一共有三个文件 makefile foo.asm bar.c函数调用遵循的是c调用约定,后面的参数先入栈,并由调用者清理堆栈 makefile ------------------- .PHONY: all cleanall: foobarfoobar: foo.o bar.o ld -s -o foobar foo.o bar.ofoo.o: foo.asm转载 2008-12-17 21:39:00 · 979 阅读 · 0 评论 -
超级诡异的c语言指针计算
int x = (int(*)[7])256- (int(*)[7])0;运行后x结果为9,不知道该如何解释?#include typedef int (*p)[7] ; // 这里的和你的那里其实效果一样,只是你给出的是一个空名字类型的。typedef p PA;int main(){ int x = (PA)256 - (PA)0; printf("x = %d/n", x原创 2009-05-17 21:40:00 · 948 阅读 · 1 评论 -
printf函数中的这个*号用法
看到一个程序这么写的 printf("%*saaj/n", 6,""); 不知道什么意思,后来试了一下,原来是在aaj前面打了六个空格。 又试了下这个printf("%*saaj/n", 6,"j");效果是 jaaj 再试一个printf("%*saaj/n", 6,"jqwertp");效果是jqwertpaaj原创 2009-05-22 10:14:00 · 1303 阅读 · 0 评论 -
另类的结构体赋值语法
再看linux kernel代码的时候发现的东东 static struct inet_protocol tcp_protocol = { handler: tcp_v4_rcv, err_handler: tcp_v4_err, next: IPPROTO_PREVIOUS, protocol: IPPROTO_TCP,原创 2008-10-20 15:50:00 · 1241 阅读 · 0 评论