C语言预处理,结构体

C语言预处理命令
1.宏定义

1.无参数宏

    #define 标识符 字符串
            #代表本行是编译预处理命名
            习惯上,宏定义大写
            代替一个字符串,介绍重复书写某个字符串的工作量
            有意义的宏代表无规律的字符串,增强可读性
            范围:宏定义开始到本源程序文件结束,可以使用#undef提前终止作用范围
            宏定义允许嵌套,前面定义了的宏可以被后面的宏使用    

2.有参数宏

    #define 标识符(形参表) 字符串
 #include<stdio.h>
 #define  MAX(x, y)   (x > y ? x : y)

 int main (){
          , b =  , max ;
         //MAX(a ,b)被宏替代
         max = MAX(a , b);
         printf("max=%d",max);
 }

             宏名与形参表的圆括号之间不能有空格
             字符串内的形参最好用括号括起来
             #define MUL(x, y) x*y
             c = MUL(a+,b+);  ==>  a+*y+
             应该为(a+)*(b+)
             所以:#define MUL(x,y) (x)*(y)
             有参数的宏的形参不是变量,不分配内存空间,不说明类型参数
             预处理程序认为有参数宏的实参是字符串a+1先去替换x而不是先运算a+1再替换x
             宏替换不会占用运行时间,只是编译时间长一些,而函数调用会占运行时间,一般用宏来代表一些比较简单的表达式。

2.文件包含#include

 文件包含命令是把指定文件全部包含进来,插入到命令所在位置,取代原来的命令行,由当前文件和指定文件组成一个文件,一起编译。
 一个#include只包含一个文件
 #include<>  和 #include ""
 区别查找指定文件的位置不同。
 尖括号只在缺省目录里找文件,缺省目录由用户设置的编程环境所决定。
 双引号先在    源程序文件所在的当前目录找指定文件,没有的话再在缺省目录里找。

3.条件编译
对一部份内容指定编译条件。

     .范式一
     #ifndef 标识符
     .....
     #endif
     eg:
     #ifndef _getkey_h
         #define _getkey_h
         #include<sys/types.h>
     #endif
     如果没有定义常量 _getkey_h则定义_getkey_h然后把sys/types.h包含进来
     .范式二
     #ifndef 标识符
     ......
     #else
     ......
     #endif
     如果没有定义标识符,编译1,否则编译2
     .范式三
     #ifdef
     ......
     #endif
     定义了标识符,就编译
         eg:#ifdef  DEBUG
                     printf("debug----");
              #endif
         在调试程序的时候在源程序头部加入
         #define DEBUG
         用于调试
         .范式四
         #ifdef 标识符
         ......
         #else
         ......
         #endif
         .范式五
         #if 表达式
         ......
         #endif
         表达式成立,编译
         .范式六
         #if 表达式
         ......
         #else
         ......
         #endif

4.结构体和共用体
   1.声明和引用结构体

    struct 结构体名
    {
        成员列表
    };
    声明结构体也是一个C语言语句,分号来结束,相当于构造了一个新的数据类型
    struct person
    {
        ];
        int age;
        char sex;
        ];
    };
    struct person p1,p2;
    系统为这个person结构体分配的内存为20+++=40字节
    printf("%d",sizeof(p1));
    如果把char phone[]改为char phone[],结果不是41,而是44
    //内存为了提高访问效率有一个规则:4字节对齐
    申明结构体时也可以同时定义变量
    struct person
    {
        ];
        ......
    }p1,p2;
    另一种方式:没有声明结构体名,不能再定义其他结构体
    struct
    {
        ];
        ......
    }p1,p2;

2.引用和初始化结构体变量

  struct person p1;
    strcpy(p1.name,"fubin");
    p1.age=;
    p1.sex='m';
    strcpy(p1.name,");
    printf("%s",p1.name);
    "."是成员运算符,在所有运算符中优先级最高

3.结构体和数组

  ] = {{,,"}};
    eg:
        #include<stdio.h>
         #include<string.h>
 int main(){
         struct student {
                 int number;
                 ];
                 char sex ;
                 int age;
                 ];
         };

         ] = {{,,,,"guangzhou"}};

         s[].number=;
         s[].sex='m';
         s[].age=;
         strcpy(s[].name,"fubin");
         strcpy(s[].addr,"hunanchangsha");
         int i;
          ; i < ]) ; i++){
                 printf("%d,%s,%c,%d,%s\n",s[i].number,s[i].name,s[i].sex,s[i].age,s[i].addr);
         }
         ;
 }

获得结构体数组的长度的方法:sizeof(s)/sizeof(s[0]);

4.结构体和指针

     结构体中的成员是按顺序连续存放在内存中,一个结构体指针指向结构体变量,结构体指针保存的值是它所指向的结构体变量的内存首地址。
     struct student s1;
     struct student *p;
     s1.number=;
     s1.sex='m';
     s1.age=;
     strcpy(s1.name,"fubin");
     strcpy(s1.addr,");
     p=&s1;
     printf("%d,%s,%c,%d,%s\n",p->number,p->name,p->sex,p->age,p->addr);

     (*p).number  =====  p->number
     一般不用前者
     p->number++ 得到number,使用之后再加1
     ++p->number 先加1,再使用

5。指向结构体数组的指针

     eg:
 #include<stdio.h>
 #include<string.h>
 int main(){
         struct student {
                 int number;
                 ];
                 char sex ;
                 int age;
                 ];
         };

         ] = {{,,,,,,"dongguan"}};

         struct student *p;
          ; p++){
                 printf("%d,%s,%c,%d,%s\n",p->number,p->name,p->sex,p->age,p->addr);
         }

         ;

 }

6.结构体指针做函数的参数

 void print_struct(struct student *p){
     p->age++;
     printf("%d,%s,%c,%d,%s\n",p->number,p->name,p->sex,p->age,p->addr);
 }

3.共用体

 共用体把几种不同数据类型的变量存在同一块内存里。
 union 共用体名
 {
     成员列表
 }变量列表;
 访问共用体的方式:
 union data {
     int i;
     char c;
     double d;
 };
 union data a ;
 a.i = ;
 a.c='A';//此时i已经没有值了
 共用体的最长长度取决于成员的最大长度
 printf(
 因为double是8字节存储
 事实上,共用体和结构体一样,为了提高访问效率,要进行内存对齐,因此实际所占的空间有时还会大一些

 不能把共用体变量作为函数的参数,也不能使函数返回共用体变量,但可以使用指向共用体变量的指针。

4.使用typeof

 声明新的类型名替代已有类型名
 type int _INT;
 可以在声明结构体的时候使用typeof
 typeof struct {
     int year;
     int month;
     int day;
 }Date;

 Date birthday;

 ];

 NUMBER n;
 n[]= ;
 typeof只为某类型变量声明一个别名,使用它不定义变量,不分配内存。

3.位运算

     C语言可以直接对二进制进行操作,有效率,适合编写系统级程序。

     位操作符:& , |,^    (异或),~,<<,>>

     位域:C语言允许以位为单位来使用内存
     含有位域的结构体:
     struct bit_data{
         ;//6位
         ;//4位
         ;//4位
         int d; //32位
     };
     若某一段要从下一个存储单元开始存放,可以定义如下:
     struct bit_data{
         ;//6位
         ;//4位
         ;//上边32个字节,下面从32之后开始存放
         ;//4位
         int d; //32位
     };
     struct bit_data{
         ;//6位
         ;//4位
         ;//上边空闲8个bit
         ;//4位
         int d; //32位
     };

5.4.make的使用和makefile的编写
    维护程序模块的关系和生成可执行代码的工具-----make
    1.makefile文件的基本构成
        makefile文件的基本单元是规则。一条规则指定一个或多个目标文件。
    
    显式规则,隐含规则,使用变量,文件指示,注释。
    1.显式规则指明了目标文件,目标文件的依赖文件,生成或更新目标文件所使用的命令。有些规则没有命令,只描述文件之间的依赖关系。
    2.隐含规则:由make根据目标文件,如make文件更具目标文件名,自动产生目标的依赖文件和生成目标的命令。
    3.使用变量
    4.文件指示
    5.注释

Linux C 程序 预处理,结构体(13)的更多相关文章

  1. Linux - PCB之task_struct结构体

     task_struct结构描述  1. 进程状态(State) 进程执行时,它会根据具体情况改变状态 .进程状态是调度和对换的依据.Linux中的进程主要有如下状态,如表4.1所示. 内核表示 含义 ...

  2. Linux串口—struct termios结构体【转】

    转自:https://blog.csdn.net/yemingzhu163/article/details/5897156 一.数据成员 termios 函数族提供了一个常规的终端接口,用于控制非同步 ...

  3. Linux下C结构体初始化

    1.前言 今天在公司看一同事写的代码,代码中用到了struct,初始化一个struct用的是乱序格式,如下代码所示: typedef struct _data_t { int a; int b; }d ...

  4. Linux下C结构体初始化[总结]

    1.前言 今天在公司看一同事写的代码,代码中用到了struct,初始化一个struct用的是乱序格式,如下代码所示: typedef struct _data_t { int a; int b; }d ...

  5. Linux内核device结构体分析

    1.前言 Linux内核中的设备驱动模型,是建立在sysfs设备文件系统和kobject上的,由总线(bus).设备(device).驱动(driver)和类(class)所组成的关系结构,在底层,L ...

  6. 结构体对齐及#pragma详细解释

    在linux下c语言结构体对齐: 1.自然对齐 struct 是一种复合数据类型,其构成元素既可以是基本数据类型(如int.long.float 等)的变量,也可以是一些复合数据类型(如array.s ...

  7. c++ 读写结构体到文件

    可以使用fwrite()将一个结构体写入文件:  fwrite(&some_struct,sizeof somestruct,1,fp);对应的fread函数可以再把它读出来,此处fwrite ...

  8. C基础--结构体成员初始化方式

    之前在linux内核代码中看到结构体成员成员初始化使用类似于.owner = THIS_MODULE, 不太见过,于是搜了个博客,分享下: 转自:http://www.cnblogs.com/Anke ...

  9. Linux C语言结构体-学习笔记

    Linux C语言结构体简介 前面学习了c语言的基本语法特性,本节进行更深入的学习. 预处理程序. 编译指令: 预处理, 宏定义, 建立自己的数据类型:结构体,联合体,动态数据结构 c语言表达式工具 ...

随机推荐

  1. win7中USB音箱没有声音解决的方法

    Win7装好后,原来在XP中工作正常的USB小音箱却不工作了,重装了声卡驱动还是一样,后来通过下面尝试最终好用了. 1.右键右下角喇叭button. 2.点击"播放设备". 3.设 ...

  2. 关于IE8中使用Jquery load方法无法正常加载页面

    最近发现,在IE8中使用Jquery load方法时无法正常加载页面,页面显示空白,没有加载.调试发现,页面多了一个</div>标签,但在FF和CH下表现正常.希望能给遇到同样问题的码农有 ...

  3. 提升 composer 的执行速读

    常常遇到 php composer.phar update 等待一二十分钟还没有更新完成的情况. 提升速读的方法: 1. 升级PHP 版本到5.4以上 2. 删除文件夹Vender(或者重命名),之后 ...

  4. oc-10-函数与方法的区别

    .函数和对象方法的区别 以-开头的方法就是对象方法(即必须实例化对象才能使用的方法) 如: -(void)Run; 区别: ()语法区别,并且对象方法都以-号开头,函数直接以返回值开头 ()对象方法的 ...

  5. MHA手动切换 原创1(主故障)

    MHA提供了3种方式用于实现故障转移,分别自动故障转移,需要启用MHA监控: 在无监控的情况下的手动故障转移以及基于在线手动切换. 三种方式可以应对MySQL主从故障的任意场景.本文主要描述在无监控的 ...

  6. VirtualBOX 虚拟机安装 OS X 10.9 Mavericks 及 Xcode 5,本人X220亲测

    原文链接:http://bbs.weiphone.com/read-htm-tid-7625465.html 建议电脑要求    Windows 7/8, 32 / 64 bit    CPU Int ...

  7. Java_Hbase Timeout issue

    设置参数hbase.rpc.timeout <property><name>hbase.regionserver.lease.period</name><va ...

  8. Asp.Net 之 抓取网页内容

    一.获取网页内容——html ASP.NET 中抓取网页内容是非常方便的,而其中更是解决了 ASP 中困扰我们的编码问题. 需要三个类:WebRequest.WebResponse.StreamRea ...

  9. Npoi 导出Excel 下拉列表异常: String literals in formulas can't be bigger than 255 Chars ASCII

    代码: public static void dropDownList(string[] datas, string filePath) { HSSFWorkbook workbook = new H ...

  10. 使用cocos2d-x制作 Texture unpacker

    使用cocos2d-x制作 Texture unpacker 没错,就是unpacker. 在大多数游戏包里面,可以找到很多纹理图集,他们基本上是用texture packer制作的,有plist文件 ...