首页 > 其他分享 >学习记录:第三周day04笔记

学习记录:第三周day04笔记

时间:2023-04-18 10:46:16浏览次数:46  
标签:__ 文件 头文件 第三周 笔记 day04 编译 main tools

预处理指令分类:

条件编译

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

版本控制、代码注释

#if

#elif

#else

#endif

 #include<stdio.h>
 ​
 #define VERSION 3
 ​
 int main()
 {
 //版本控制
 #if VERSION > 2
     printf("最新版本!\n");
 #elif VERSION > 1
     printf("还凑活\n");
 #else
     printf("赶紧升级!\n");
 #endif
     
 //代码注释
 #if 0
 #endif
     
 #if 1
 #endif
 }

头文件卫士:防止头文件被重复包含(写在头文件里)

#ifndef 宏名(大写文件名_H)

#define 宏名(大写文件名_H)

#endif

判断、调试

#ifdef 宏名

#elif

#else

#endif

 #include<stdio.h>
 //可以在编译时添加宏DEBUG:gcc 文件名.c -DDEBUG
 #define DEBUG 1
 ​
 int main()
 {
     int num=10;
     int ret=scanf("%d",&num);
 #ifdef DEBUG
     printf("ret=%d\n",ret);
 #endif
 }
 ​
 //打印调试信息
 #ifdef DEBUG
     #define debug(...) printf(__VA_ARGS__)
 #else
     #define debug(...)
 #endif
 //打印错误信息
 #define error(...) printf("%s %s:%d %s %m %s %s\n",__FILE__,\
 __func__,__LINE__,__VA_ARGS__,__DATE__,__TIME__)
 ​

 

 

 

头文件中应该写什么:

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

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

全局变量声明

函数声明

宏常量

宏函数

typedef 类型重定义

结构、枚举、联合的类型设计声明

头文件的编写规则:

1、为每个.c文件写一份.h文件,.h文件时对它对应的.c文件的说明(main.c头文件大部分情况可以不写)

2、如果需要用到某个.c文件中的变量、函数、宏时,只需要把该文件的.h导入即可

3、.c文件也要导入自己的.h文件,目的是为了让定义与声明保持一致

头文件的相互包含:

假如a.h包含了b.h的内容,而b.h中又包含a.h的内容,这时就会产生头文件的相互包含,无法编译通过

解决方案:把a.h中需要b.h的内容和b.h中需要a.h的内容提取出来,额外再写另一个c.h

 

Makefile:

Makefile是由一系列的编译器指令组成的可执行文件,叫做编译器脚本

在终端执行make命令就会自动执行Makefile脚本中的编译器指令,他可以根据文件的修改时间,和依赖关系来判断哪些文件需要编译,哪些不需要

一个项目工程只有一个Makefile文件,且没有其它任何后缀

Makefile的编译规则:

     1. 如果这个工程没有编译过,那么我们的所有 c 文件都要编译并被链接。
  2. 如果这个工程的某几个 c 文件被修改,那么我们只编译被修改的 c 文件,并链接目标程序。
  3. 如果这个工程的头文件被改变了,那么我们需要编译引用了这几个头文件的 c 文件,并链接目标程
    序。  
 /*
 一个简单的Makefile脚本格式:
 ​
  执行目标(target):依赖
 ​
  编译指令(一定要Tab键开头)
 ​
  被依赖的目标1:依赖的文件
 ​
  编译指令
 ​
  被依赖的目标2:依赖文件
 ​
  编译指令
 */
 CC=gcc
 BIN=all
 OBJ=main.o mail_book.o tools.o
 FLAG=-Wall -Werror
 STD=-std=gnu99
 LINK=-lm
 ​
 all:$(OBJ)
     $(cc) -o $(BIN) main.o tools.o mail_book.o
 ​
 main.o:main.c tools.h mail_book.h
     $(cc) -c main.c
 tools.o:tools.c tools.h
     $(cc) -c tools.c
 mail_book.o:mail_book.c mail_book.h tools.h
     $(cc) -c mail_book.c
 clean:
     rm $(OBJ)
         
 //
 //偷懒的方法
 CC=gcc
 BIN=all
 OBJ=main.o mail_book.o tools.o
 FLAG=-Wall -Werror
 STD=-std=gnu99
 LINK=-lm
 ​
 all:$(OBJ)
     $(cc) -o $(BIN) $(OBJ) $(LINK)
 ​
 %.o:%.c
     $(CC) $(STD) $(FLAG) -c $< -o $@
 ​
 clean:
     rm $(OBJ)

 

2048游戏-多文件编程

文件规则

main.c 程序的入口

game2048.c game2048.h 游戏的业务逻辑功能

direction.c dirction.h 方向键处理功能

tools.c tools.h 工具函数

创建文件脚本:

project_create.sh

编辑文件脚本:

game2048.conf

编译脚本:

Makefile

要求数据存储在堆内存中

标签:__,文件,头文件,第三周,笔记,day04,编译,main,tools
From: https://www.cnblogs.com/-xdj/p/17241399.html

相关文章

  • 学习记录:第三周day03笔记
    通讯录项目:姓名、性别、电话,最多存储50个联系人功能:1、添加新联系人2、按名字删除联系人3、按名字修改联系人4、查找联系人,名字或电话,支持模糊查询5、显示所有联系人信息6、退出系统  预处理指令:程序员所编写的代码不能被真正的编译器所编译,需要先经过一段......
  • 学习记录:第三周day02笔记
    一、字符串字符:人能看懂的符号或图案,在内存中以整数形式存储,根据ASCII码表中的对应关系显示相应的符号或图案'\0'0空字符'0'48'A'65'a'97串:是一种数据结构,存储类型相同的若干个数据;对于串型结构的处理是批量性的,会从头开始直到遇到结束标志 voidshow_arr(int......
  • vue 课堂笔记
    1、----数组合并----说明:定义两个数组arr1和arr2,然后把这两个合并放入arr3中;constarr1=[1,2,3,4,5]    constarr2=[6,7,8,9] //合并数组   constarr3=[...arr1,...arr2]//转字符串以逗号分割   constarr4=arr3.join(',')   ......
  • performance_schema 笔记(二)——配置详解
    提前预警:这一篇巨长。。。做好心理准备。。。删除了书里重复说明和过于复杂的一些解释,完整版请参考原书《MySQL性能优化金字塔法则》 零、基本概念instruments:生产者,用于采集MySQL中各种各样的操作产生的事件信息,可以称为监控采集配置项consumers:消费者,用于存储来自instruments......
  • performance_schema 笔记(一)—— 简介与快速入门
    系列文章参考自《MySQL性能优化金字塔法则》,删除了书里重复说明和过于复杂的一些解释,完整版请参考原书。第一篇将简单介绍performance_schema是什么、有什么用、用法快速入门,它由哪些表组成以及这些表的用途。 一、performance_schema简介performanceschema是运行在较低级别的......
  • Unity框架:JKFrame2.0学习笔记(五)——事件系统(2)
    前言上一篇记录了框架的事件系统的内部构成和实现,这篇记录下事件系统的使用。如何使用新建脚本EventTestusingJKFrame;usingUnityEngine;publicclassEventTest:MonoBehaviour{voidStart(){//添加监听EventSystem.AddEventListener("inp......
  • 关于spinninup的学习笔记
    作为reinforcementlearning的一个入门学习的项目,spinningup的地址:https://spinningup.openai.com/en/latest/index.html  =================================================......
  • Go笔记(八):指针
    1、指针在Go中,指针的操作有两个符号:&(取地址)和*(变量指针的声明|取指针变量的值)。一个指针变量指向了一个值的内存地址。Go中函数传值皆为值拷贝,对于引用类型的传值,可以创建一个指针变量,无需拷贝数据。Go中,类型指针不能进行偏移和运算。2、指针地址和指针......
  • ReactiveUI使用笔记,教程总结
    ReactiveUI使用笔记,教程总结一、LINQ和RxLINQ(LanguageIntergratedQuery)对数据集合、关系数据、XML文件等对象进行查询和提取数据的技术,提供了统一的类似SQL的语法来对数据进行查询,而不用关心数据源的不同。二、Rx(ReactiveExtensions)对LING的一种扩展,提供了一种新的组织和......
  • TypeScript学习笔记-尚硅谷TypeScript教程(李立超老师TS新课)
    TypeScript学习笔记-尚硅谷TypeScript教程(李立超老师TS新课)https://blog.csdn.net/m0_46549017/article/details/124626987?ops_request_misc=&request_id=&biz_id=&utm_medium=distribute.pc_search_result.none-task-blog-2~all~koosearch~default-2-124626987-null-null.142^......