2021.7.28标准C语言

本文详细介绍了C语言中的预处理指令,包括文件包含、宏常量、宏函数和条件编译的用法。讲解了头文件的卫士防止重复包含,以及头文件中应包含的内容和编写规则。同时,提到了Makefile的作用和编译规则,以及2048游戏的源文件组织结构。
摘要由CSDN通过智能技术生成

复习:
1.文件包含
#include 把一个头文件导入到当前文件中
#include <>
#include “”
系统是通过环境变量指定头文件的加载路径
还可以通过编译参数 -I /path 指定头文件的加载路径
2.宏常量
#define 宏名(全大写) 字面值数据
如果在代码中使用了宏,在预处理时会把所有的宏替换为宏名后面的字面值数据
优点:提高代码可读性、提高可扩展性、提高安全性、还可以与case配合使用
注意:宏名一般全部大写,末尾不要加分号,不能直接换行,需要使用续行符
预定义的宏:
func
FILE
DATE
TIME
LINE

3.宏函数
    #define FUNC(arg) arg*10
    不是真正的函数,就是带参数的宏,使用宏函数的位置会先替换成宏函数后面的代码,然后根据提供的参数替换掉对应参数的位置
    注意:可以使用续行符和{}来保护代码
    二义性:
        由于宏所处的位置或参数的不同可能导致宏函数由多种解释,这就叫宏的二义性。
        可以再最外层加小括号,每个参数都加小括号保护起来,以此降低产生二义性的可能,尽量不要在宏函数中使用自变运算符
    运算符:
        #   把宏函数的参数变成字符串
        ##  合并两个参数编程标识符

4.条件编译
    根据条件决定代码是否参与最终的编译
    #if/#elseif/#else/#ifdef#ifndef#endif
    头文件卫士:    防止头文件被重复包含
        #ifndef FILENAME_H
        #define FILENAME_H
        #endif//FILENAME_H

    版本控制:
        #if VERSION >=3
        #elif VERSION >=2
        #elif VERSION >=1
        #else
    编译器判断:
        #if __cplusplus
            //c++
        #else
            //c
        #endif

5.常考的笔试面试题:
    定义一个宏表示100年有多少秒,忽略闰平年
    #define SEC (3600*24*365*100u)

    在类型重定义时#define与typedef的区别?(整理)

    在定义常量时#define与const的区别?

    宏函数与普通函数的区别?

    #define SWAP5(a,b) {typeof(a) t=a; a=b; b=t;} //typeof只能是gnu编译器使用 

头文件中应该写什么:
问题:头文件可能被任何源文件包含,意味着头文件的内容太会在多个目标文件中存在,合并使要保证不能冲突
重点:头文件中只能编写声明语句,不能有定义语句
全局变量声明 extern int num;
函数声明
宏常量
宏函数
typedef 类型重定义
结构、联合、枚举的类型声明

头文件的编写规则:
1.为每个.c文件写一份同名的.h文件,.h文件是对.c文件的说明
2.如果需要使用某个.c文件中的变量、函数、宏、结构体…只需要把该.c文件的.h文件导入即可使用
3. .c文件也需要导入它的.h文件,目的是为了让声明与定义一致

头文件的相互包含:
假如a.h包含了b.h,b.h又包含了a.h,这种情况就叫做头文件的相互包含,会导致编译错误

当确认变量、函数名已经定义且导入,但是依然报错:未定义 xxxx,先考虑是否头文件卫士写错,再考虑是否是头文件相互包含

解决方法:
    从a.h中把需要用到的b.h的内容提取出来,从b.h中把需要用到的a.h的内容提取出来,放入新编写的c.h中

Makefile
Makefile是由一系列遍历指令组成的可执行文本文件,也叫做编译脚本
在终端执行make命令就会自动执行Makefile文件中的编译指令,它根据文件的修改时间,来判断那些文件需要编译,那些文件不需要重新编译,根据依赖情况判断哪些文件先编译、哪些文件后编译,从而提高编译效率

编译规则:
1.如果这个工程没有编译过,那么我们的所有.c文件都要编译并被链接成可执行文件
2. 如果这个工程的某几个.c文件被修改,则此次只编译被修改过的.c文件,并链接生成目标程序。
3.如果某个.h文件被修改,依赖该头文件的所有.c文件全部编译并链接目标程序。

一个最简单的Makefile脚本:
执行目标:依赖文件...
    编译命令
被依赖的目标1:依赖文件
    编译命令
被依赖的目标2...
...
..
clean:
    rm ...(.o文件)

2048游戏:
文件规则:
main.c 程序入口
game2048.c game2048.h 程序的业务逻辑
direction.c direction.h 方向键处理
tools.c tools.h 工具函数
Makefile 编译脚本文件
project_create.sh 创建文件的脚本文件

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值