预处理

1> 使用注意

  • 以#开头
  • 在代码被翻译成0和1之前执行
  • 预处理指令可以出现在任何位置
  • 作用域是从编写指令那一行开始到文件结束

2> 宏定义

  1. 基本使用

    ① 使用#define定义
    ② 宏定义常常用于替换常量,提高代码的可重用性
    ③ 宏名一般大写
    ④ 宏定义后边没有分号
  2. 有参数的宏

    ① #define fun(a, b) a + b,定义两个数相加的宏
    ② 通过fun(a, b)来调用这个宏
    ③ 宏定义只是纯粹的代码替换,在编译时调用
    ④ 在定义带参数的宏时,尽量为每个参数和最后的结果都加上括号
  3. 示例

    #include <stdio.h>
    //定义带参数的宏实现两个数的乘积
    #define product(a, b) ((a) * (b))
    int main()
    {
    //定义一个变量用于存储结果
    int result; result = product(2 + 3, 2 + 3);
    printf("result = %d", result); return 0;
    }

3> 条件编译

  1. 基本使用

    ① #if后必须加上#endif
    ② 条件编译的判断条件不能为普通的变量,要使用宏
    ③ #ifdef COUNT表示如果定义了宏COUNT就编译#ifdef COUNT
    后的代码
  2. 示例

    #include <stdio.h>
    
    //定义宏A
    #define A 10 int main()
    { //如果没有定义宏A,就编译以下代码
    #ifndef A
    printf("没有定义宏变量A\n");
    //如果定义了宏A,就编译以下代码
    #else
    printf("定义了宏变量A\n");
    #endif return 0;
    }

4> 文件包含

  1. 基本使用

    ① 系统文件用<>包含,用户自定义文件用()包含
    ② 不允许循环包含
    ③ #include包含的文件,只是纯文本拷贝文件内容到#include出现的
    地方
    ④ 用条件编译可以控制某个文件只被包含一次
    ⑤ 不同文件中用于条件编译的宏不能同名
  2. 示例

    //文件名main.h
    #include <stdio.h>
    //该文件中包含了求两个整数和的函数
    #include "sum.h" int main()
    {
    //定义一个变量存储函数sum的返回值
    int result; //求两个整数的和
    result = sum(10, 12);
    printf("result=%d\n", result); return 0;
    }
    ----------
    //文件名sum.c
    int sum(int a, int b)
    {
    return a + b;
    }
    ----------
    //文件名sum.h
    #ifndef SUM_H
    #define SUM_H
    int sum(int a, int b);
    #endif

typedef

1> 基本使用

  • 用typedef为某个类型定义的别名,可以像这个类型一样定义变量
  • typedef通常用于为一个复杂的类型定义一个简单且有意义的别名,如:为结构体定义一个别名

2> 使用注意

  • 某种情况下宏定义可以完成typedef的功能,宏定义的别名在前

     ① 宏定义在定义新类型时,是文本替换
    ② typedef在定义新类型时,是语义替换

#define和typedef

1> 相同点

  • 都可以为各种数据类型定义别名

2> 不同点

  • typedef 仅限于为类型定义别名;#define 不仅可以为类型定义别名,也可以为数值定义别名
  • typedef 是由编译器执行解释的;#define 是由编辑器执行处理的,是预处理指令

static和extern

1> static和extern对函数的作用

  1. extern

    ① 可以声明和定义一个外部函数,可以被本文件和其他文件访问
    ② 默认为外部函数,extern可以省略
    ③ 在整个项目的所有文件中,不允许出现同名的外部函数
  2. static

    ① 可以声明和定义一个内部函数,只能被本文件访问
    ② static不可以省略
    ③ 在整个项目的不同文件中,可以出现同名的内部函数

2> static和extern对变量的作用

  1. 全局变量

    ① 默认为外部变量
    ② static用于定义一个内部全局变量,extern用于声明一个外部全局
    变量
    ③ 不同文件中同名的内部变量不会相互影响
    ④ 外部全局变量可以重复定义,且同一时刻只会保留一个值
  2. 局部变量

    ① static定义的局部变量,只会定义一次,代码执行时定义存储空间
    ② static延长了局部变量的声明周期,但不会改变作用域
    ③ 所有调用用static定义变量的代码块共享该局部变量

C语言-07-预处理、typedef、static和extern的更多相关文章

  1. typedef , static和 extern

    typedef 1.作用:给已经存在的类型起一个新的名称 2.使用场合: 1> 基本数据类型 2> 指针 3> 结构体 4> 枚举 5> 指向函数的指针 #include ...

  2. C语言之预处理命令与用typedef命名已有类型

    预处理命令 主要是改进程序设计环境,以提高编程效率,不属于c语言本身的组成部分,不能直接对它们进行编译,必须在对 程序编译之前,先对程序中的这些特殊命令进行“预处理”.比如头文件. 有以下三类:宏定义 ...

  3. 《OOC》笔记(1)——C语言const、static和extern的用法

    <OOC>笔记(1)——C语言const.static和extern的用法 C语言中const关键字用法不少,我只喜欢两种用法.一是用于修饰函数形参,二是用于修饰全局变量和局部变量. 用c ...

  4. C语言-1.static 和 extern使用,2.文件,3.数据块读写

    1.static 和 extern使用, 1)修饰局部变量 static修饰局部变量特点:延长局部变量的生命周期 ,static修饰的局部变量只会被执行一次 extern不能修饰局部变量 2)修饰全局 ...

  5. C语言-07其它相关

    预处理指令 /* 不带参数的宏定义 1.所有的预处理指令都是以#开头 2.预处理指令分3种 1> 宏定义 2> 条件编译 3> 文件包含 3.预处理指令在代码翻译成0和1之前执行 4 ...

  6. typedef,static,const用法

    一.typedef主要功能是定义一个已存在类型的别名,但是和宏并存 宏与typedef区别 1.宏定义只是简单的字符串替换 2.typedef定义的类型是类型的别名,typedef后面是一个整体声明, ...

  7. 【VS开发】static、extern分析总结

    引用请注明出处:http://blog.csdn.net/int64ago/article/details/7396325 对于写了很多小程序的人,可能static和extern都用的很少,因为sta ...

  8. 15-static和extern关键字1-对函数的作用

    一.extern与函数 如果一个程序中有多个源文件(.c),编译成功会生成对应的多个目标文件(.obj),这些目标文件还不能单独运行,因为这些目标文件之间可能会有关联,比如a.obj可能会调用c.ob ...

  9. static和extern关键字 对函数的作用

    本文目录 • 一.extern与函数 • 二.static与函数 • 三.static.extern与函数的总结说明:这个C语言专题,是学习iOS开发的前奏.也为了让有面向对象语言开发经验的程序员,能 ...

随机推荐

  1. XML数据源快速开发框架——XmlFramwork

    浪漫的周末从cnblogs开始.话说,今天和往常的周末一样,韩君躲在被窝里用手机翻阅着园子里的珠玑.一篇<应用XML作为数据库的快速开发框架>的文章在韩君脑子里激起了一波球形闪电.想想上周 ...

  2. 关于FileStream读取大文件问题

    小的文本文件(100M以下)直接用File类的ReadAllText()和WriteAllText()方法 这两个方法内部其实就是封装了StreamReader类的ReadToEnd()和Stream ...

  3. Unity 3D 中实现对物体 位置(position) 旋转(rotation) 大小(scale) 的全面控制

    今天分享一些基础控制的脚本 1.位置(Position): 控制位置很简单,首先要知道要在xyz哪几个轴上移动,确定好后定义代表着那些轴的移动变量,速度(m_speed在函数外定义为全局变量)然后通过 ...

  4. tar的-t参数使用

    -t, --list           list the contents of an archive 例如: pengdl@localhost:~/test$ tar -czvf shell.ta ...

  5. VueJs2.0建议学习路线

    最近VueJs确实火了一把,自从Vue2.0发布后,Vue就成了前端领域的热门话题,github也突破了三万的star,那么对于新手来说,如何高效快速的学习Vue2.0呢. 既然大家会看这篇文章,那么 ...

  6. SQL Server临界点游戏——为什么非聚集索引被忽略!

    当我们进行SQL Server问题处理的时候,有时候会发现一个很有意思的现象:SQL Server完全忽略现有定义好的非聚集索引,直接使用表扫描来获取数据.我们来看看下面的表和索引定义: CREATE ...

  7. tomcat端口被占用

    这里就以win7为例进行讲解. 首先打开cmd,打开的方法很简单,在开始菜单中直接输入即可.同样也可以按下win+R打开运行,然后输入cmd即可. 在dos命令中输入以下命令查询正在被使用的端口号以及 ...

  8. Websocket 概述

    WebSocket protocol 是HTML5一种新的协议.它实现了浏览器与服务器全双工通信(full-duplex). [[ from websocket是什么原理? ]] 一.WebSocke ...

  9. 组合数学 + STL --- 利用STL生成全排列

    Ignatius and the Princess II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K ( ...

  10. sencha grid templatecolumn模板列,actioncolumn和renderer实现单元格重绘

    templatecolumn列: {                                     xtype: 'templatecolumn',                     ...