Skip to content

Commit ffa8a88

Browse files
committed
merge
2 parents 7bdcb69 + d02f81d commit ffa8a88

17 files changed

+1037
-25
lines changed

docs/design_gamedev.md

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,9 +77,12 @@ private:
7777
Game() { ... }
7878

7979
public:
80-
inline static Game instance; // 如果定义在头文件中,需要 inline!
80+
// inline static Game instance; // 虽然很爽,但不能这样写,因为 Game 在他的 }; 结束前都是不完整类型
81+
static Game instance; // 非定义声明,就好比全局变量的 extern Game instance 一样,不需要是完整类型
8182
};
8283

84+
inline Game Game::instance; // 如果定义在头文件中,需要 inline!
85+
8386
Game::instance.updatePlayers();
8487
```
8588

docs/design_virtual.md

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -178,9 +178,9 @@ struct Reducer {
178178
};
179179
180180
int reduce(vector<int> v, Reducer *reducer) {
181-
int res = reducer.init();
181+
int res = reducer->init();
182182
for (int i = 0; i < v.size(); i++) {
183-
res = reducer.add(res, v[i]);
183+
res = reducer->add(res, v[i]);
184184
}
185185
return res;
186186
}
@@ -251,12 +251,12 @@ SumReducer 和 ProductReducer 无需任何修改,体现了**开闭原则**。
251251

252252
```cpp
253253
int reduce(Reducer *reducer) {
254-
int res = reducer.init();
254+
int res = reducer->init();
255255
while (true) {
256256
int tmp;
257257
cin >> tmp;
258258
if (tmp == -1) break;
259-
res = reducer.add(res, tmp);
259+
res = reducer->add(res, tmp);
260260
}
261261
return res;
262262
}
@@ -268,20 +268,20 @@ int reduce(Reducer *reducer) {
268268
269269
```cpp
270270
int cin_reduce(Reducer *reducer) {
271-
int res = reducer.init();
271+
int res = reducer->init();
272272
while (true) {
273273
int tmp;
274274
cin >> tmp;
275275
if (tmp == -1) break;
276-
res = reducer.add(res, tmp);
276+
res = reducer->add(res, tmp);
277277
}
278278
return res;
279279
}
280280
281281
int vector_reduce(vector<int> v, Reducer *reducer) {
282-
int res = reducer.init();
282+
int res = reducer->init();
283283
for (int i = 0; i < v.size(); i++) {
284-
res = reducer.add(res, v[i]);
284+
res = reducer->add(res, v[i]);
285285
}
286286
return res;
287287
}
@@ -297,9 +297,9 @@ struct Inputer {
297297
};
298298

299299
int reduce(Inputer *inputer, Reducer *reducer) {
300-
int res = reducer.init();
301-
while (int tmp = inputer.fetch()) {
302-
res = reducer.add(res, tmp);
300+
int res = reducer->init();
301+
while (int tmp = inputer->fetch()) {
302+
res = reducer->add(res, tmp);
303303
}
304304
return res;
305305
}
@@ -353,9 +353,9 @@ Inputer 负责告诉 reduce 函数如何读取数据,Reducer 负责告诉 redu
353353
354354
```cpp
355355
int reduce(Reducer *reducer) {
356-
int res = reducer.init();
357-
while (int tmp = reducer.fetch()) { // fetch 凭什么和 init、add 放在一起?
358-
res = reducer.add(res, tmp);
356+
int res = reducer->init();
357+
while (int tmp = reducer->fetch()) { // fetch 凭什么和 init、add 放在一起?
358+
res = reducer->add(res, tmp);
359359
}
360360
return res;
361361
}
@@ -430,7 +430,7 @@ struct StopInputerAdapter : Inputer {
430430
{}
431431

432432
optional<int> fetch() override {
433-
auto tmp = inputer.fetch();
433+
auto tmp = inputer->fetch();
434434
if (tmp == stopMark)
435435
return nullopt;
436436
return tmp;
@@ -466,7 +466,7 @@ struct FilterInputerAdapter {
466466
467467
optional<int> fetch() override {
468468
while (true) {
469-
auto tmp = inputer.fetch();
469+
auto tmp = inputer->fetch();
470470
if (!tmp.has_value()) {
471471
return nullopt;
472472
}
@@ -515,7 +515,7 @@ struct FilterInputerAdapter : Inputer {
515515

516516
optional<int> fetch() override {
517517
while (true) {
518-
auto tmp = inputer.fetch();
518+
auto tmp = inputer->fetch();
519519
if (!tmp.has_value()) {
520520
return nullopt;
521521
}
@@ -588,8 +588,8 @@ struct PoostInputerAdapter {
588588
{}
589589

590590
optional<int> fetch() override {
591-
if (poostIn.hasNext()) {
592-
return poostIn.getNext();
591+
if (poostIn->hasNext()) {
592+
return poostIn->getNext();
593593
} else {
594594
return nullopt;
595595
}

docs/hello_world.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,8 @@ main 函数总是返回一个整数 (`int` 类型),用这个整数向操作系
6060

6161
如果程序正常执行完毕,正常结束退出,那就请返回 0。
6262

63+
> {{ icon.detail }} 通常来说有返回类型的函数都需要在所有分支都有 return 语句,但有趣的是,C++ 标准对 main 函数做了特殊的“宽大处理”:在控制流达到 main 函数的结尾时,如果没有遇到 `return` 语句,则等价于执行 `return 0;`。所以对于你本来就打算返回 0 的情况,也可以偷懒不写 `return` 语句,编译器自动会帮你加上。以及,main 函数必须返回 `int` 类型,不能返回 `void` 类型。
64+
6365
返回一个不为 0 的整数可以表示程序出现了异常,是因为出错了才退出的,值的多少可以用于表明错误的具体原因。
6466

6567
> {{ icon.fun }} 操作系统:我调用了你这个程序的 main 函数,我好奇程序是否正确执行了?让我们约定好:如果你运转正常的话,就返回0表示成功哦!如果有错误的话,就返回一个错误代码,比如返回1表示无权限,2表示找不到文件……之类的。当然,错误代码都是不为0的。

docs/img/clang-ast-example.png

134 KB
Loading

docs/img/compile-3-stage.png

62.9 KB
Loading

docs/img/cpp-llvm-clang-route.png

48.1 KB
Loading

docs/img/cuda-llvm-clang-route.png

92.3 KB
Loading

docs/img/decl-vs-def.png

11.8 KB
Loading

docs/img/llvm-front-mid-back.png

432 KB
Loading

docs/img/llvm-ir-asm-vs-x86-asm.png

190 KB
Loading

docs/img/llvmValueType.png

204 KB
Loading

docs/index.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030

3131
也可以在 [B 站](https://space.bilibili.com/263032155) 发私信给小彭老师哦。
3232

33-
> {{ icon.tip }} 本书还在持续更新中……要追番的话,可以在 [GitHub]({{ config.repo_url }}) 点一下右上角的 “Watch” 按钮,每当小彭老师提交新 commit,GitHub 会向你发送一峰电子邮件,提醒你小彭老师更新了。
33+
> {{ icon.tip }} 本书还在持续更新中……要追番的话,可以在 [GitHub]({{ config.repo_url }}) 点一下右上角的 “Watch” 按钮,每当小彭老师提交新 commit,GitHub 会向你发送一封电子邮件,提醒你小彭老师更新了。
3434
3535
更新时间:{{ build_date }}
3636

@@ -98,12 +98,12 @@ void try_call_foo(T &t) {
9898
```cpp
9999
template <class T, class = void>
100100
struct has_foo {
101-
inline constexpr bool value = false;
101+
static constexpr bool value = false;
102102
};
103103
104104
template <class T>
105105
struct has_foo<T, std::void_t<decltype(std::declval<T>().foo())>> {
106-
inline constexpr bool value = true;
106+
static constexpr bool value = true;
107107
};
108108
109109
template <class T>
@@ -160,7 +160,7 @@ void try_call_foo(T &) {
160160
}
161161
```
162162

163-
如果回到 C++98,那又要罪加一等!`enable_if` 和 是 C++11 引入的 `<type_traits>` 头文件的帮手类,在 C++98 中,我们需要自己实现 `enable_if`…… `declval` 也是 C++11 引入的 `<utility>` 头文件中的帮手函数……假设你自己好不容易实现出来了 `enable_if``declval`,还没完:因为 constexpr 在 C++98 中也不存在了!你无法定义 value 成员变量为编译期常量,我们只好又用一个抽象的枚举小技巧来实现定义类成员常量的效果。
163+
如果回到 C++98,那又要罪加一等!`enable_if``declval` 是 C++11 引入的 `<type_traits>` 头文件的帮手类和帮手函数,在 C++98 中,我们需要自己实现 `enable_if`…… `declval` 也是 C++11 引入的 `<utility>` 头文件中的帮手函数……假设你自己好不容易实现出来了 `enable_if``declval`,还没完:因为 constexpr 在 C++98 中也不存在了!你无法定义 value 成员变量为编译期常量,我们只好又用一个抽象的枚举小技巧来实现定义类成员常量的效果。
164164

165165
```cpp
166166
template <class T, class = void>

0 commit comments

Comments
 (0)