分类: C/C++
2010-09-26 16:54:15
Unix中的结构体对齐规则。
struct node {int a; short b} ; sizeof(node) = 8;
struct node {short a; short b; short c}; sizeof(node) = 6;
struct node {char a; int b; char c}; sizeof(node) = 12;
#pragma pack(1) 按照单字节对齐(取消对齐)。
struct 未域运算。
struct node{ u32_t b:5; u32_t g:6; u32_t r: 5; };
表示 b变量在空间中只占5位。当 后面跟0时表示 从下一字节起始单元开始。
有符号数做扩展的时候要保符号位扩展 0x101 扩展为0x11111101 0x01扩展为0x00000001。
|
今天内容:
在项目中写函数库时,尽量把仅在当前文件中引用的变量或函数用static修饰。
将函数的集合生成静态库 ar -rs libmy.a add.o sub.o
使用静态库 gcc main.c -L.(指定库所在路径) -lmy(指定库的名称)。
在使用静态库时只将main中使用过的函数编译到可执行程序中,而单纯gcc编译则会把全部函数编译到可执行程序中。
使用静态连接库时每次加载程序时都会将所用到的所有函数加载进内存中,动态连接库可以不加载内存中已有的函数。
gcc -fPIC -c add.c sub.c将源文件编译为与位置无关的目标文件。
gcc -shared add.o sub.o -o libmy.so 将目标文件生成为动态库文件。
gcc main.c -L. -lmy 将mian.c 编译为使用libmy.so的可执行程序。
./a.out会不能执行需要将.so 文件复制到 /usr/lib/目录下才能够使用。
ldd ./a.out 查看a.out 使用了哪些库。
gcc main.c -L. -lmy -static 有动态库和静态库时强制使用静态库。
export LD_LIBRARY_PATH=./指定当前目录为库搜索路径,追加环境变量export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./
连接器ld默认读取/etc/ld.so.conf 文件来找库文件的路径 使用ldconfig 来使ld.so.conf 生成ld.so.cache 使修改生效。
共享库的命名lib+库名+.so+主版本号+次版本号 ,然后创建创建主版本号到次版本号的连接ln -s lib+库名+.so+主版本号 lib+库名+.so+主版本号+次版本号,再创建库名到主版本号的连接ln -s lib+库名+.so lib+库名+.so+主版本号。
查看链接脚本 ld –verbose
|
今天内容:预处理
规则1:只要一条宏定义语句里包含有操作符,就应该用括号把他括起来
规则2:宏定义越紧凑越好;表达式比语句好,单条语句比多条语句好
规则3: 在宏定义里一定要注意避免使用会导致二义性或副作用的C语言元素
规则3A:在宏定义里避免使用有副作用的表达式
规则4:宏越简单越好,否则,就应该把他定义为一个函数
man ascii查看ascii码。 gcc -DDEBUG=0 -D 选项。
宏可以减少调用函数产生的开销。具体见源码。
|