大一初级实训

初级实训一点学习笔记

第一次实训学到了很多东西, 看看过几天有没有时间记录下来

最近很懒 很不好.

6.10更新


1.lambda表达式


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// 形式
auto funtion_name = []() {};
// (auto) 为函数返回值, 写auto可以使编译器自动识别类型
// []为捕获列表,可以捕获该访问域的变量,在函数里面就可以使用这个变量
// ()为函数的参数列表
// {}函数主体部分
// 最后有分号



// 例如
auto quit = [&participator](Meeting &meeting) {
auto t_meet = meeting.getpaticipator();
for (auto i = t_meet.begin(); i != t_meet.end(); ++i) {
if (/*****/)
i = t_meet.erase(i);
}
};

2.Makefile

Makefile是一个文件名为 Makefile 的文本文件,用于定义项目的编译规则,以便于整个项目的编
译。
(创建方法: touch Makefile 编辑方法: gedit Makefile vim Makefile …)
如果不使用Makefile,可能我们就需要跟之前一样手打一大串编译命令来编译代码——大一时便是
深有体会。 g++ main.cpp support1.cpp support2.cpp support3.cpp … 这样的命令每次都
要打一遍,如果是在平时的题目倒还好,如果遇到有数十个cpp和hpp的项目那就不好玩了,而且这
样编译,有些依赖关系不清楚也是一个麻烦。
Makefile中就可以定义好各个文件的依赖关系,在之后再需要编译时,只需要执行 make 命令就可以
自动编译了。
在一次 make 之后,一般 会生成很多 目标文件(*.o) 和一个可执行文件,当这些文件和源代码都没
有被修改时,再次执行 make 会提示 make: ‘bin/your_program’ is up to date. ,而当你只修
改了一个源代码文件再执行 make 时,它也不会重复编译已经最新的文件,而只编译依赖了你的源
代码的文件,这对提高编译效率是非常重要的。
(摘抄自实训简介.)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
// 定义变量, 简单的字符串替换, 注意空格数
CC := g++
FLAGS := -std=c++11 -w -g
// 路径
INC_DIR := include
SRC_DIR := src
BUILD_DIR := build
BIN_DIR := bin
// -I 编译器参数, 到其他地方寻找头文件
INCLUDE := -I./$(INC_DIR)

// $(变量名) 使用变量.
// target: prerequisites
// t 要生成的目标文件, pre 所需要的依赖文件, 没有则向下寻找生成
$(BIN_DIR)/main: $(BUILD_DIR)/support1.o $(BUILD_DIR)/main.o
// 创建目录
// -p 建立上层目录
@mkdir -p $(BIN_DIR)
// 编译命令
// $^ 所有依赖文件
// -o 生成文件命名
// $@ 目标文件
$(CC) $(FLAGS) $(INCLUDE) $^ -o $@

// % 适配符, 这样便能编译多个文件.
$(BUILD_DIR)/%.o: $(SRC_DIR)/%.cpp
@mkdir -p $(BUILD_DIR)
// -c 只编译不链接
// $< 第一个依赖文件
$(CC) $(FLAGS) $(INCLUDE) -c -o $@ $<

// 单纯的命令, 没有依赖文件, 可以用make clean运行
clean:
@rm -rf $(BUILD_DIR)
@rm -rf $(BIN_DIR)
// rm 删除文件或空文件夹
// -r 递归删除 -f 强制删除

Makefile简介.pdf

资料参考来源, 作者:卢家熙