Docker 构建 Frp 镜像
构建 Frps 镜像
- Dockerfile 编写
1 | FROM amd64/alpine:3.10 |
1 | FROM amd64/alpine:3.10 |
conio.h
不是 C 标准库中的头文件,在 ISO 和 POSIX 标准中均没有定义。conio
是 Console Input/Output(控制台输入输出)的简写,其中定义了通过控制台进行数据输入和数据输出的函数,主要是一些用户通过按键盘产生的对应操作,比如 getch()
函数等等。大部分 DOS、Windows、Phar Lap、DOSX,OS/2 等平台上的 C 编译器提供了此头文件,UNIX 和 Linux 平台的 C 编译器本身通常不包含此头文件。另外在项目开发中,平时主要是使用 conio.h
这个头文件中的 getch()
函数,即读取键盘字符但是不显示出来(without echo),但是含有 conio.h
的代码在 Linux 下无法直接编译通过,因为 Linux 没有这个头文件。但 Linux 平台下完全可以使用 ncurses 替代 conio.h
头文件,ncurses
支持的 API 可以阅读 官方文档。值得一提的是,ncurses
在 Linux 平台实现了 getch()
、scanw()
、getstr()
等函数。
string
是 STL 的字符串类型,通常用来表示字符串。而在使用 string
之前,字符串通常是用 char*
表示的。string
与 char*
都可以用来表示字符串,两者的区别如下:
string
是一个类,char*
是一个指向字符的指针string
封装了 char*
来管理字符串,本质是一个 char*
类型的容器string
不用考虑内存释放和越界的问题string
负责管理 char*
所分配的内存。每一次 string
的复制,取值都由 string
类负责维护,不用担心复制越界和取值越界等问题string
提供了一系列的字符串操作函数,例如:查找(find)、拷贝(copy)、删除(erase)、替换(replace)、插入(insert)模板是实现代码重用机制的一种重要工具,其本质是类型参数化,即把类型定义为参数。C++ 提供了类模板和函数模板,详细的使用可参考教程:C++ 进阶基础之二
程序的输入指的是从输入文件将数据传送给程序,程序的输出指的是从程序将数据传送给输出文件。C++ 的输入输出包含以下三个方面的内容:
对系统指定的标准设备的输入和输出
:即从键盘输入数据,输出到显示器屏幕。这种输入输出称为标准的输入输出,简称 标准 I/O
。以外存磁盘文件为对象进行输入和输出
:即从磁盘文件输入数据,数据输出到磁盘文件。以外存文件为对象的输入输出称为文件的输入输出,简称 文件 I/O
。对内存中指定的空间进行输入和输出
:通常指定一个字符数组作为存储空间(实际上可以利用该内存空间存储任何信息)。这种输入和输出称为字符串输入输出,简称 串 I/O
。在 C 语言中,用 printf
和 scanf
进行输入输出,往往不能保证所输入输出的数据是可靠的安全的。在 C++ 的输入输出中,编译系统对数据类型进行严格的检查,凡是类型不正确的数据都不可能通过编译。因此 C++ 的 I/O 操作是类型安全(Type Safe)的。C++ 的 I/O 操作是可扩展的,不仅可以用来输入输出标准类型的数据,也可以用于用户自定义类型的数据。C++ 通过 I/O 类库来实现丰富的 I/O 功能。这样使 C++ 的输人输出明显地优于 C 语言中的 printf
和 scanf
,但是也为之付出了代价,C++ 的 I/O 系统因此变得比较复杂,要掌握许多使用细节。C++ 编译系统提供了用于输入输出的 iostream
类库。iostream
这个单词是由 3 个部分组成的,即 i-o-stream
,意为输入输出流。在 iostream
类库中包含许多用于输入输出的类,如下图所示:
static_cast
可以用于类层次结构中基类(父类)和派生类(子类)之间指针或者引用的转换。static_cast
可以用于基本数据类型之间的转换,比如将 int
转化成 char
,或者将 char
转换成 int
,这种类型转换的安全性需要开发人员来保证。dynamic_cast
可以用于类层次结构中的上行转换和下行转换,但是不支持基本数据类型的转换。dynamic_cast
与 static_cast
的效果一样。dynamic_cast
具有类型检查的功能,比 static_cast
更安全。C++ 提供了函数模板(function template)。所谓函数模板,实际上是建立一个通用函数,其函数类型和形参类型不具体指定,用一个虚拟的类型来代表,这个通用函数就称为函数模板。凡是函数体相同的函数都可以用这个模板来代替,不必定义多个函数,只需在模板中定义一次即可。在调用函数时,系统会根据实参的类型来取代模板中的虚拟类型,从而实现不同函数的功能。