c语言笔记

        

1丶文件包含

    #include 把一个头文件导入到当前文件中

        <> ""

        系统通过环境变量指定头文件的加载路径

        还可以通过编译参数-I /path 指定头文件的加载路径  优先级最高

2丶宏常量

    #define 宏名 字面值数据(不加分号)

    如果在代码中使用了宏,在预处理时会把所有的宏替换成宏名后面的字面值数据

    有点:提高代码可读性丶提高可扩展性(可批量修改)丶提高安全性(相较于变量)丶还可以和case配合使用(case后面只能跟常量)

    注意:宏名一般全部大写(全局变量首字母大写),末尾不要加分号,不能直接换行(需要使用续航符\)

        预定义的宏:

            __func__

            __FILE__

            __DATE__

            __TIME__获取时间

            __LINE__获取该宏所在行号

3丶宏函数

    #define FUNC(arg)  arg*10

    不是真正的函数,就是带参数的宏,使用宏函数的位置会先替换成宏函数后面的代码,然后根据提供的参数替换掉对应参数的位置

    注意:可以使用续航符和大括号来保护代码

    二义性:由于宏所处的位置或参数的不同可能导致宏函数有多种解释,这就叫宏的二义性

            可以在最外层加小括号,每个参数都加小括号,降低产生二义性的可能,不要在宏中使用自变运算符

    运算符:

        # 把宏函数的参数变成字符串

        #define FUNC(arg)  #arg

        printf("%s",FUNC(123));

        ## 合并两个参数变成标识符

4丶条件编译

    根据条件来决定代码是否参与最终编译

    #if/#elif/#else/#ifdef/#ifndef/#endif

    头文件卫士:防止头文件重复包含

    #ifndef FILENAME_H

    #define FILENAME_H

    #endif

    版本控制:

        #if VERSION >=3

        #elif VERSION >=2

        #elif VERSION >=1

        #else 

    编译器判断

        #if __cplusplus

            printf("c++编译器\n");

        #else

            printf("c编译器\n");

        #endif

5丶常考的笔试面试题

    定义一个宏表示100年有多少秒,忽略闰平年问题

    #define SEC (3600*24*365*100)u

    在类型重定义时#define和typedef的区别

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

    宏函数与普通函数的区别

    

头文件中应该写什么:

    问题:头文件可能被任何的源文件包含,意味着头文件的内容会在多个目标文件中存在,合并时要保证不能冲突

    重点:头文件中只能编写声明语句,不能有定义语句

        全局变量的声明可以写  extern int num;

        函数声明

        宏常量

        宏函数

        typedef  类型重定义

        结构体丶联合丶枚举的类型声明

头文件的编写规则:

    1丶为每个.c文件写一份.h文件,.h文件是对.c文件的说明

    2丶如果需要使用某个.c文件中的变量丶函数丶宏丶结构体...只需要吧该.c文件的.h文件导入即可

    标准库中文件编译好的.o文件已经在默认添加的lib.so中,所以不用编译链接

    3丶.c文件也需要导入他的.h文件,目的是为了声明和定义一致

头文件的相互包含:

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

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

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

makefile

    makefile是一系列编译指令组成的可执行文件,也叫编译脚本

    在终端执行make命令就会自动执行makefile文件中的编译指令,他可以根据文件的修改时间来判断哪些文件需要编译,哪些不需要编译,根据依赖情况判断编译顺序,从而提高编译效率

    1. 如果这个工程没有编译过,那么我们的所有 c 文件都要编译并被链接。

    2. 如果这个工程的某几个 c 文件被修改,那么我们只编译被修改的 c 文件,并链接目标程序。

    3. 如果这个工程的头文件被改变了,那么我们需要编译引用了这几个头文件的 c 文件,并链接目标程序。

    一个最简单的makefile脚本:

    执行文件:依赖

        编译指令

    被依赖的目标1:依赖

        编译指令

        ...

    clean:

        rm...

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值