内核代码中一些c语言用法
container_of,(C 语言 up cast)
内核中的定义:
Cscope tag: container_of
# line filename / context / line
1 27 drivers/gpu/drm/radeon/mkregtable.c <<container_of>>
#define container_of(ptr, type, member) ({ \
2 63 drivers/staging/lustre/include/linux/libcfs/libcfs.h <<container_of>>
#define container_of(ptr, type, member) \
3 78 drivers/staging/rtl8192e/rtllib.h <<container_of>>
#define container_of(ptr, type, member) ({ \
4 61 drivers/staging/rtl8192u/ieee80211/ieee80211.h <<container_of>>
#define container_of(ptr, type, member) ({ \
5 791 include/linux/kernel.h <<container_of>>
#define container_of(ptr, type, member) ({ \
6 18 scripts/kconfig/list.h <<container_of>>
#define container_of(ptr, type, member) ({ \
7 26 tools/perf/util/include/linux/kernel.h <<container_of>>
#define container_of(ptr, type, member) ({ \
8 84 tools/virtio/linux/kernel.h <<container_of>>
#define container_of(ptr, type, member) ({ \
scripts/kconfig/list.h
1 #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) 2 3 /** 4 * container_of - cast a member of a structure out to the containing structure 5 * @ptr: the pointer to the member. 6 * @type: the type of the container struct this is embedded in. 7 * @member: the name of the member within the struct. 8 * 9 */ 10 #define container_of(ptr, type, member) ({ \ 11 const typeof( ((type *)0)->member ) *__mptr = (ptr); \ 12 (type *)( (char *)__mptr - offsetof(type,member) );})
分析详见:
http://www.cnblogs.com/cute/archive/2011/04/01/2002474.html
结构体和数据
谈结构体struct 初始化多出的点号“.”,数组[]初始化多出的逗号“,”
cat test.c
内容如下:
1 #include <stdio.h> 2 3 #define MAXTITL 30 4 #define MAXAUTL 20 5 6 struct book { 7 float off; 8 char title[MAXTITL]; 9 char author[MAXAUTL]; 10 float value; 11 12 }; 13 14 int main() 15 { 16 puts("C lange test!"); 17 struct book b1 = { .value = 19.9, .author = "author", .title="C test tutorial" }; 18 printf("Book value: %f\n", b1.value); 19 printf("Book author: %s\n", b1.author); 20 printf("Book title: %s\n", b1.title); 21 printf("Book off: %f\n", b1.off); 22 int m,n; 23 int a2[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0}; 24 for(n=0;n<11;n++) 25 printf("%d\n",a2[n]); 26 int a1[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0, }; 27 for(m=0;m<11;m++) 28 printf("%d\n",a1[m]); 29 return 0; 30 }
执行:
gcc test.c -o test ./test
结构体的空数组
example 1, 求大小
1 #include <string.h> 2 #include <stdio.h> 3 4 struct tag1 5 { 6 int a; 7 int b; 8 }__attribute ((packed)); //size = 8 9 10 struct tag2 11 { 12 int a; 13 int b; 14 char *c; 15 }__attribute ((packed)); //size = 12 on 32bit platform, 16 size on 64bit 16 17 struct tag3 18 { 19 int a; 20 int b; 21 char c[0]; 22 }__attribute ((packed)); //size = 8 23 24 struct tag4 25 { 26 int a; 27 int b; 28 char c[1]; 29 }__attribute ((packed)); //size = 9 30 31 int main() 32 { 33 struct tag2 l_tag2; 34 struct tag3 l_tag3; 35 struct tag4 l_tag4; 36 37 memset(&l_tag2,0,sizeof(struct tag2)); 38 memset(&l_tag3,0,sizeof(struct tag3)); 39 memset(&l_tag4,0,sizeof(struct tag4)); 40 41 printf("size of tag1 = %ld\n",sizeof(struct tag1)); 42 printf("size of tag2 = %ld\n",sizeof(struct tag2)); 43 printf("size of tag3 = %ld\n",sizeof(struct tag3)); 44 printf("size of tag4 = %ld\n",sizeof(struct tag4)); 45 46 printf("l_tag2 = %p,&l_tag2.c = %p,l_tag2.c = %p\n",&l_tag2,&l_tag2.c,l_tag2.c); 47 printf("l_tag3 = %p,l_tag3.c = %p\n",&l_tag3,l_tag3.c); 48 printf("l_tag4 = %p,l_tag4.c = %p\n",&l_tag4,l_tag4.c); 49 return 0; 50 }
example 2,柔性数组,动态内存
C语言0长度数组使用技巧, 又解决了小内存碎片问题提高了性能。
#include <stdlib.h> #include <string.h> #include <stdio.h> typedef struct{ int stuID; int age; char address[]; // same with address[0] }ST_STU_INFO,*pStuInfo; // size is 8 pStuInfo ComposeStuInfo( int stuID,int age, const char *paddress) { pStuInfo ptmpInfo = malloc(sizeof(*ptmpInfo) + sizeof(char) * strlen(paddress) + 1); if(ptmpInfo != NULL){ ptmpInfo->stuID = stuID; ptmpInfo->age = age; strcpy(ptmpInfo->address, paddress); } return ptmpInfo; } void printStuInfo(pStuInfo ptmpInfo) { printf("stuID : %d, age : %d, \nAddress: %s\n" "Size of Struct:%ld\n\n", ptmpInfo->stuID, ptmpInfo->age, ptmpInfo->address, sizeof(*ptmpInfo)); } int main() { pStuInfo CodeLab = ComposeStuInfo( 100013, 20, "Tencent Building, Central District, High-tech Park, " "Nanshan District, Shenzhen"); if(CodeLab != NULL){ printStuInfo(CodeLab); free(CodeLab); } pStuInfo subCodeLab = ComposeStuInfo(200013, 23, "Tencent Building"); if(subCodeLab != NULL){ printStuInfo(subCodeLab); free(subCodeLab); } return 0; }
REF: