• Linux之IFS间隔符、C编程、Makefile工程文件、gdb调试、宏定义、预处理、assert和调试用特殊的宏


    1 间隔符

    在shell下的for循环语句中,容器中,各个元素之间 是通过 间隔符 来分开的

    默认情况下:读取 列表中的值----以 空格、TAB、换行  为间隔符
    列表可以为:
        常量
        变量
        某个命令的输出结果
        某个目录下的所有文件
        
    临时更改 间隔符:
    IFS.OLD=$IFS
    IFS=$'\n'    

    IFS=$IFS.OLD        //换回 默认值了

    注意:---设置新的 间隔符的方法
    IFS=:
    IFS=$'\n':;"      -----表示间隔符为 换回 冒号 分号 双引号


    题目:
    1 先将passwd文件中包含root的每一行打印出来
    2 再将该行中的每一个字段打印出来


    脚本代码:
    #!/bin/bash
    IFS_OLD=$IFS                            ----给间隔符 做备份
    IFS=$'\n':                                ----让间隔符为 换行 和 冒号
    for temp in `cat /etc/passwd | grep root`
    do
        echo word:$temp    
    done
    IFS=$IFS_OLD                            ----恢复默认的 间隔符
    exit 0

    2  Linux下C语言编程
    1 编译步骤
      编写源程序hello.c
      编译:gcc -g -o hello.out hello.c
            -g 说明带调试信息,以后可以使用gdb进行调试
            -o 后面跟的是编译出来的可执行文件名
            最后跟的是需要编译的源程序名称,可以有多个  
            
    2 gdb的使用
      gdb hello.out
      b 1        //设置断点   可以是 行号  函数名
      run   //从头开始  调试运行        //还有版本 可以使用 start  不设断点,也会停在第1条 语句上(一般为赋值语句)
      list 1    //显示10行  ---问题:如果是多文件呢
      next        //下一步   注意:回车----自动执行上1条命令
      step        //进入 函数
      finish    //跳出本函数,即 从当前函数 返回
      bt        //backtrace   函数调用栈 即: 回去的踪迹
      i locals        //信息 局部变量  即:查看 局部变量  
      print result    //打印 变量
      
      set var sum=0        //设置变量的值
      或p result=33     //同上
      或p printf("result = %d\n",result)
      
      frame 2      //查看其它函数下的局部变量时,先要切换 栈帧frame
      或f 2
      
      display sum    //每次停下来,都显示sum的值
      undisplay 取消显示
      
      continu 或 c         //运行到 下1个断点     一般,设置个新 断点,然后continue
      
      i breakpoints   //查看所有断点信息
      delete breakpoints 2  //删除断点2
      delete breakpoints  //删除所有断点
      
      break 9 if sum!=0        //break  ...  if
      
      disable breakpoints 2
      enable breakpoints 2
      
      
      x/7b  array1    //打印存储器内容    7组  每组为1个字节   地址,如数组名
      watch array1[5]
      info watchpoints  //查看所有的 观察点
     
     quit   //退出 gdb 
      
    3 makefile的使用
    编辑makefile

    all:
        gcc -g -o aaa.out hello.c
    clean:
        rm *.out        
            
    注意:
    1) all行不能少
    2) 第2行是命令,前面必须用TAB键进行分隔,不能用空格        
    3) 使用时,直接运行make就会自动调用该makefile文件的规则进行编译


    5 宏定义
    #define PI 3.1415

    #define MAX_ARRAY 100
    int a[MAX_ARRAY];

    #define MAX_ETC(a,b)   ((a)>(b)?(a):(b))


    int main()
    {
      ((10)>(20)?(10):(20));         
        return 0;
    }

    6 编译预处理
    场合:在h文件中经常要用
    如在student.h中
    #ifndef     STUDENT_H
    #define       STUDENT_H
    int sum(int a,int b,int c);
    int get_math();


    #endif

    用法:
    1)如果student.c文件中,加入了一行代码   #include "student.h"
    2)如果people.c文件中,加入了一行代码  #include "people.h".  如果people.h文件中已有很多.h文件


    7 提高调试效率的2大手段
    手段1:----使用 assert 宏定义
    注意:
    1)只在debug下有效
    2)当assert后面的条件不成立时,程序会终止,并打印出错的信息。
    如:
    assert(age<100);     //当年龄age 大于等于100时,该语句会异常终止,并有详细的错误信息(注意,在Release版本中,该语句会失效,因此是用于调试的手段)


    手段2:----使用 __func__,__FILE__,__LINE__
    (注意是 双下划线)
    __func__          为当前语句执行时的  函数名(字符串)   ----C99中增加的内容,是1个特殊的标识符,直接用就可以了。注意:它不是 宏定义
    __FILE__           为当前语句执行时的  文件名(字符串)     ----是 宏定义
    __LINE__          为当前语句执行时的  行号(整型数)     ----是 宏定义

    所以可以使用如下语句:
    printf("%s  %s  %d\n",__func__,__FILE__,__LINE__);

  • 相关阅读:
    【我的C/C++语言学习进阶之旅】C/C++编程笔记:C语言使用宏定义#define来处理通用的可抽取的代码块
    Eureka 学习笔记(2)加载eureka-server.properties中的配置
    Javascriput中数组的创建以及最值的求法
    数字音频工作站(DAW)fl studio 21 for mac 21.2.3.3586中文版图文安装教程
    原神游戏干货分享:探索璃月的宝箱秘密,提高游戏资源获取效率!
    什么品牌的台灯适合学生用?视力专家推荐的护眼台灯
    C++ 基础一
    LyScript 实现Hook改写MessageBox
    C# 解决从其他地方迁移项目,引用中大多数包是感叹号的问题
    【数据结构】堆的应用+TOP-K问题+二叉树遍历
  • 原文地址:https://blog.csdn.net/qq_38220914/article/details/127711975