23,UC(02)

回顾:
  堆栈、队列、链表、二叉树
  除了链表以外,其它的都是可以用顺序表和链式表同时实现
  但 二叉树基本都是使用 链式表实现。
  排序算法:冒泡、插入、选择、快速、归并,优先快速
  查找算法:无序采用线性查看,有序可以使用二分查找
今天:
  预处理的指令
   #pragma 的几种用法(有很多种):
   #pragma GCC dependency "文件名"
    表示当前文件不能比 ""中的文件旧(当前文件最后修改时间比""中的文件晚),否则 会产生 警告。
   #pragma GCC poison 单词
    表示是 单词变成了毒药,禁止使用,否则产生错误。
   #pragma pack(整数) 设定结构对齐和补齐的字节数。

  环境变量 - 操作系统启动后,内存中会存储很多东西,环境变量就是其中之一。操作系统会把一些常用设置加载到内存中,就是环境变量。环境变量有很多,常见的有:
  PATH - 系统路径,操作系统在执行命令/可执行文件时,需要加上文件所在的路径,但文件所在的路径如果设置在PATH中,就可以省略。
  CPATH - 定位C程序的头文件所在目录。
  LIBRARY_PATH - Unix/Linux库文件所在路径
  LD_LIBRARY_PATH - 在运行时,查找共享库所在的路径。
  ...
  Unix/Linux修改环境变量受SHELL影响,在bash下:
   环境变量的修改方式:
   export 环境变量名=环境变量值
   多个路径用:分开
   比如:修改PATH,可以输出:
   export PATH=.:$PATH
   注意:一个字都不能错

  如果想永久生效,可以配置 系统配置文件,PATH可以在用户登录目录下的.bashrc中配置。
  在重启系统前,需要使用source .bashrc生效
  重启系统后,不用source 即可生效。

  定位头文件的方式:
   1 可以用""方式,在""中加上路径查找。
   2 系统目录中查找 /usr/include等。
   3 使用环境变量 CPATH 或 C_INCLUDE_PATH配置路径。
   4 在gcc时,用 -I 选项指定。
 
   可以把 多个编译好的目标文件 打包成为一个文件,就是库文件。库文件有两种:静态库(.a)和共享库(.so)。
   静态库和共享库区别:
    静态库是 函数的归档,在使用时,复制函数的代码区到最终的文件中。
    共享库是 函数的归档,在使用时,把函数在共享库中的地址拿到最终的文件中。
    静态库的效率稍高一点,但占用空间非常大,而且不利于修改和维护。
    共享库的效率稍低一点,但占用空间小,而且修改和维护方便。
  开发中,代码基本都打包为共享库。

  静态库的创建和使用
    创建静态库文件(.a)
    1 写源代码 add.c,保存退出。
    2 编译源程序 add.c,生成目标文件 add.o 。
      gcc -c add.c
    3 打包生成 静态库文件(.a)
      ar -r 静态库文件名 add.o
     静态库文件名命名规范: lib库名.a
     比如:ar -r libmyku.a add.o
    别的程序调用静态库:
    1 写程序test.c,保存退出。
    2 编译test.c,生成目标文件test.o。
      gcc -c test.c
    3 连接库文件的方式:
      a 直接连接   gcc test.o libmyku.a
      b 配置环境变量LIBRARY_PATH,把库文件所在路径加入,运行 gcc test.o -l myku 即可(库名)。
      c gcc test.o -l myku -L 库所在路径
    注:静态库文件在使用时,必须提供 .h文件。
   共享库的创建和使用:
    共享库的创建(.so)
     1 写源程序 add.c,保存退出。
     2 编译源程序,生成目标文件(add.o)。
     gcc -c -fpic add.c (-fpic省略也行)
     3 生成共享库文件。
     gcc -shared add.o -o libmyku.so
     共享库文件的命名规范: lib库名.so
    共享库的使用:
     使用方式和静态库一样。
  注:静态库使用函数时复制代码段,因此静态库在执行时,可执行文件中包含了所有的代码,a.out不再需要静态库。
   共享库使用函数时只是留下了函数地址,因此共享库在执行时,可执行文件中只有地址而没有代码,a.out需要在共享库中执行相关函数的代码。环境变量LD_LIBRARY_PATH可以帮助a.out找到共享库。
   ldd 可执行文件/库文件名 - 可以查看库文件的关系
  
   动态调用共享库(了解)
    #include <dlfcn.h>
    void *dlopen(const char *filename, int flag);
     打开库文件,filename是带路径的文件名,flag可以为
    RTLD_LAZY: 延迟加载(用的时候再把库文件加载到内存)
    RTLD_NOW: 马上加载
    void *dlsym(void *handle, const char *symbol);
    用函数名 从打开的库文件中获取一个函数。
    int dlclose(void *handle);
    关闭库文件。
    char *dlerror(void); //查看是否出错。
 
  C程序员的错误处理
   C程序错误处理 是需要程序员自己解决,而后续语言(C++/Java)都是用异常(Exception)机制处理错误。
   C程序用返回值 代表是否出错,包括:
   1 如果返回值是int,并且返回的数据是非负数,一般用-1代表出错,非负数代表正确。
   2 如果返回值是int,但返回的数据也可能是负数,用指针接收返回数据,用返回值0 代表成功,返回值-1代表出错。
   3 如果返回值是指针,一般用NULL代表出错,非空代表正确。
   4 如果不需要考虑错误处理,返回值用void 。
 注:上面4种都是一般情况,有特例。

 练习: 设计函数的错误处理
  有4个函数:
   1 打印传入的字符串。(4)
   2 判断传入的字符串是否为error,如果是返回ok,不是error报错。(3)
   3 返回1-10的随机数,如果随机数是5,报错。(1)
   4 比较两个整数的大小,返回最大值,如果相等,报错。2

 

 


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值