• C语言-07-预处理、typedef、static和extern


    预处理

    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
      ");
      //如果定义了宏A,就编译以下代码
      #else
          printf("定义了宏变量A
      ");
      #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
      ", 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定义变量的代码块共享该局部变量
  • 相关阅读:
    Springboot + Mybatis 多数据源配置
    构建微服务:Spring boot 入门篇
    IDEA SpringBoot代码修改热部署/加载
    vue-cli知识点
    vuex知识点
    正则基本知识
    多行SQL语句拼成一条数据
    软件的版本控制
    ASP.NET 表单验证实现浅析
    建造者模式
  • 原文地址:https://www.cnblogs.com/theDesertIslandOutOfTheWorld/p/4719212.html
Copyright © 2020-2023  润新知