logo

【C语言】标准库(头文件、静态库、动态库),windows与Linux平台下的常用C语言标准库


风晓
风晓 2024-01-07 11:37:27 17700 赞同 0 反对 0
分类: 资源
一、Introduction 1.1 C语言标准库


C语言标准库是一组预定义函数、宏和文件的集合,这些函数和文件提供了一些基本的功能和操作,可供C语言程序使用。C语言标准库由C语言的制定者定义,并包含在C语言的编译器中。

C语言标准库包含了许多常见的功能,例如输入和输出操作、字符串处理、内存管理、数学运算、日期和时间处理等。它为C程序员提供了一些基本的工具,使他们能够更方便地开发应用程序。

一些常见的C语言标准库包括stdio.h(用于输入和输出操作)、stdlib.h(用于内存管理和其他实用函数)、string.h(用于字符串处理)、math.h(用于数学计算)等。这些库函数可以通过包含相应的头文件来访问,并通过调用库函数来实现所需的功能。

前面的描述似乎还不够清晰,再详细一点,C语言标准库包含以下几个部分:

头文件(Header Files):C语言标准库包含一系列的头文件,用于声明函数原型、定义常量和数据类型等。开发者可以通过包含适当的头文件来使用标准库中提供的函数和类型。

静态库(Static Libraries):C语言标准库还以静态库的形式提供,其中包含了标准库函数和类型的实现代码。静态库是在编译时与应用程序一起链接,使得应用程序可以调用标准库提供的函数和类型。

动态库(Dynamic Libraries):一些操作系统和编译器还提供了C语言标准库的动态库版本。动态库是在运行时被应用程序动态加载和链接的库。应用程序可以共享同一个动态库的实例,从而节省内存,并且可以在库的更新时实现简单的升级。

1.2 历代C语言标准
C 语言的标准从 1972 年开始,历经多次更新。以下是历代 C 语言标准的简要介绍:

C89/C90(ANSI C):这是最早的C语言标准,由美国国家标准学会(ANSI)和国际标准化组织(ISO)于1989年联合发布。它规定了C语言的基本语法、数据类型、运算符等,并定义了一个基本的标准库。该标准奠定了C语言的基础,并广泛应用于早期的C编译器和开发工具。

C99:C99标准于1999年发布,并对C语言进行了一些重要的改进。它引入了新的语言特性,如单行注释、布尔类型、变长数组、复合字面量等。此外,C99标准还增加了更多的库函数,包括对复数数学、格式化输入输出、浮点数环境等的支持。然而,C99的广泛采用相对较晚,因此某些编译器和开发环境对其支持有限。

C11:C11标准于2011年发布,是C语言的最新正式标准。它在C99的基础上进行了进一步改进,并引入了一些新的特性,如类型泛型、多线程支持、匿名结构体和联合体、对 Unicode 字符的支持等。C11还扩展了标准库,增加了新的头文件和函数,如对多线程编程的支持、原子操作、时间和日期处理等。

C17(C18):于 2018 年发布,是目前为止最新的 C 语言编程标准,用来修订 C11 标准。C17 没有引入新的语言特性,只对 C11 进行了补充和修正。

C2x:正在制定中。

C语言没有官方网站,ISO的官方网站和ANSI的网站,提供了C语言标准的相关信息。

ISO :https://www.iso.org/home.html

ANSI :https://www.iso.org/home.html

例:下图c17标准页面: ISO/IEC 9899:2018


如果你感兴趣,想要c17的英文pdf,可以在我的wx公众号回复:c17

1.3 主流C语言编译器
C语言有许多不同的编译器可供使用,每个编译器都有其独特的特性、性能和支持程度。以下是一些常见的C语言编译器:

GCC(GNU Compiler Collection):GCC 是一个广泛使用的开源编译器套件,支持多种编程语言,包括C语言。它是许多Linux发行版的默认编译器,并且在其他平台上也有广泛的支持。GCC 提供了丰富的优化选项和严格的符合标准的支持,被认为是一个强大而可靠的编译器。

Clang:是 LLVM 项目下的 C/C++/Objective-C/Objective-C++ 编译器,,支持C、C++ 和Objective-C。它设计注重灵活性、可扩展性和良好的诊断能力。Clang 具有较好的标准兼容性,并提供了先进的静态分析和代码检查功能。Clang 的静态分析能力使其成为许多代码编辑器和集成开发环境(IDE)的首选。

Visual C++:Visual C++ 是微软公司提供的专有编译器,它是 Visual Studio 集成开发环境的一部分。Visual C++ 提供了一套完整的工具链,包括编辑器、调试器和性能分析器。它在 Windows 平台上具有良好的集成和支持,并且提供了一些扩展功能,如Windows API 的直接支持。

Intel C++ Compiler:Intel C++ Compiler 是由英特尔公司提供的优化编译器,针对 Intel 架构和处理器进行了优化。它提供了强大的优化选项和针对特定硬件的优化技术,可生成高性能的代码。Intel C++ Compiler 在科学计算和高性能计算领域有较广泛的应用。

除了上述编译器,还有其他一些编译器可供选择,如TCC(Tiny C Compiler)、IBM XL C/C++、Digital Mars C/C++ Compiler等。

不同编译器对C语言标准的支持程度是不同,在进行开发的时候,不仅要选择适当的编译器,可能还需要手动指定C语言标准。

比如在Linux下使用gcc的时候,可以使用 -std来指定C语言标准:

gcc -std=c11 -o exm exm,c
1
常用的visual studio,使用的是MSVC编译器,即使选择c17标准,也是不支持变长数组的。下面的代码会报错(当然可以用malloc代替):

int n = 10;
char str[n] = {};
1
2
可以通过扩展安装clang扩展,或者添加外部工具来使用gcc或者clang(这一点或许vs code更方便)。

二、C语言标准库
2.1 常用标准头文件
对于标准头文件,在程序中引用即可,如:

#include<limits.h>
1
C语言有多少个标准头文件呢呢?
不确定:这和编译器、编译器的版本和配置有关。
常用的C语言标准库有:

stdio.h:提供输入输出函数,如printf()和scanf()等。
stdlib.h:提供通用工具函数,如malloc()和free()等。
string.h:提供字符串处理函数,如strcpy()和strcat()等。
math.h:提供数学函数,如sin()和cos()等。
time.h:提供时间处理函数,如time()和clock()等。
ctype.h:提供字符处理函数,如isalpha()和isdigit()等。
assert.h:提供断言宏,用于调试程序。
stdarg.h:提供可变参数列表的函数,如printf()和scanf()等。
errno.h:提供错误码宏,用于标识错误类型。
setjmp.h:提供非局部跳转函数,如setjmp()和longjmp()等。
signal.h:提供信号处理函数,如signal()和raise()等。
locale.h:提供本地化处理函数,如setlocale()和localeconv()等。
float.h:提供浮点数处理宏,如FLT_DIG和DBL_MAX等。
limits.h:提供整数处理宏,如INT_MAX和LONG_MAX等。
stddef.h:提供基本类型定义,如size_t和ptrdiff_t等。
2.2 常用标准静态库
常见的C语言标准静态库:

libc.a:C语言标准库的核心部分,提供了输入输出函数、字符串处理函数、内存管理函数等基本功能。
libm.a:数学库,包含了数学函数,如三角函数、指数函数、对数函数等。
libpthread.a:线程库,提供了线程相关的函数和类型,用于多线程编程。
libdl.a:动态链接库支持库,提供了动态链接库的相关函数和类型。
librt.a:实时库,提供了实时相关的函数和类型,如定时器函数、时间操作函数等。
libcrypt.a:密码库,提供了密码相关的函数和类型,如加密和解密函数。
在C语言代码中连接静态库有几种常用的方法。

一种是使用#pragma comment宏来导入静态库;
另一种方法是在项目属性中配置附加依赖项;
还有一种方法是直接将静态库文件加载到项目工程中。
在使用标准库时,通常不用显式地链接静态库,因为标准库已经在编译器中链接;
头文件中的函数 声明和类型声明(通常这些库函数在标准静态库中定义),是为了让编译器直到函数的签名和类型信息,以便在编译时进行类型检查和符号解析;
静态库的连接通常适用于用户自定义的库或自三方库。
例:

#include<winsock2.h>
#praga comment(lib,"ws2_32.lib)
1
2
三、windows平台
Windows 操作系统上常用的 C 语言库包括:

C 运行时库(C Runtime Library):包括 msvcrt.lib 和 msvcr*.dll(*代表版本号),提供了 C 语言的基本运行时支持,如内存管理、输入输出、字符串操作等。

Windows API:包括一系列的库文件和动态链接库(DLL),提供了与 Windows 操作系统交互的函数和数据结构。其中一些常用的库文件有:

Kernel32.lib 和 Kernel32.dll:提供了与系统核心功能相关的函数,如进程管理、线程管理、文件操作、时间和日期等。
User32.lib 和 User32.dll:提供了与用户界面相关的函数,如窗口创建、消息处理、输入处理、绘图等。
Gdi32.lib 和 Gdi32.dll:提供了图形设备接口函数,用于绘制图形和处理图像。
Winsock2.lib 和 Ws2_32.dll:提供了与网络编程相关的函数和数据结构,用于进行网络通信。
其他库:除了 Windows API,还有许多其他的第三方库可以用于 Windows 平台的 C 语言开发,如开源的库、图形库、数据库访问库等。一些常见的库有:

OpenSSL:用于加密、解密和安全通信。
SQLite:用于嵌入式数据库操作。
zlib:用于压缩和解压缩数据。
libpng:用于处理 PNG 图像文件。
libxml2:用于处理 XML 数据。
常用头文件有:

<windows.h>:这是用于 Windows API 编程的头文件,包含了许多与 Windows 操作系统交互的函数和数据结构。

<winsock2.h>:用于网络编程,提供了与网络通信相关的函数和数据结构。

<ole2.h>:用于 COM(Component Object Model)编程,包含了与组件对象模型相关的函数和定义。

<shlobj.h>:用于操作文件系统和文件夹,提供了访问和管理文件夹的函数和定义。

<shellapi.h>:用于 Shell 编程,包含了与 Windows Shell 相关的函数和定义,用于操作窗口、任务栏等。

<mswsock.h>:提供了高级的 Windows Sockets 函数和定义,用于更复杂的网络编程操作。

<dbghelp.h>:用于调试和错误处理,包含了调试相关的函数和定义,如符号解析、错误信息处理等。

注意:使用这些头文件的时候,通常需要连接相关的静态库才能使用。因为头文件通常只是函数和变量的声明,而定义一般在静态库中。这些平台独有的头文件,编译器不会帮他连接到静态库,所以你要手动连接。

四、Linux平台
在 Linux 系统上,常见的 C 语言库包括:

C 运行时库(C Runtime Library):Linux 上的 C 运行时库通常称为 GNU C 库(GNU C Library,简称 glibc)。它是标准的 C 库,提供了 C 语言的基本运行时支持,如内存管理、输入输出、字符串操作等。

POSIX 库:POSIX 是一个定义了操作系统接口标准的系列规范,其中包含了许多与操作系统交互的函数和数据结构。在 Linux 上,POSIX 相关的库提供了与 POSIX 标准兼容的函数,常见的库包括:

<unistd.h>:提供了访问操作系统服务的函数,如文件操作、进程管理、系统调用等。
<pthread.h>:用于多线程编程,提供了线程相关的函数和定义。
<signal.h>:用于信号处理,提供了处理进程间通信和异常处理的函数和定义。
动态链接库(Dynamic Linking Libraries):Linux 上许多库以动态链接库的形式存在,常见的动态链接库包括:

<libm.so>:数学库,提供了各种数学函数。
<libpthread.so>:线程库,提供了对 POSIX 线程的支持。
<libdl.so>:动态加载库,用于在运行时动态加载其他库。
开源库:Linux 是开源操作系统,拥有丰富的开源库可以供开发者使用。一些常见的开源库有:

OpenSSL:用于加密、解密和安全通信。
SQLite:用于嵌入式数据库操作。
zlib:用于压缩和解压缩数据。
libpng:用于处理 PNG 图像文件。
libxml2:用于处理 XML 数据。
在 Linux 系统上独有的一些 C 语言头文件包括:

<unistd.h>:提供了访问操作系统服务的函数,如文件操作、进程管理、系统调用等。

<fcntl.h>:提供了对文件描述符的操作,如打开、关闭、读取和写入文件。

<sys/types.h>:定义了一些基本的系统数据类型,如 size_t、pid_t 等。

<sys/stat.h>:包含了文件状态相关的函数和宏,用于获取和修改文件的元数据。

<sys/socket.h>:用于网络编程,提供了与套接字相关的函数和数据结构。

<sys/time.h>:提供了时间和日期相关的函数和定义,如获取当前时间、计时器等。

<sys/wait.h>:用于进程间通信,提供了等待子进程状态变化的函数和宏。

<pthread.h>:用于多线程编程,提供了线程相关的函数和定义。

<signal.h>:用于信号处理,提供了处理进程间通信和异常处理的函数和定义。

<dlfcn.h>:用于动态加载库,提供了动态链接库的加载和使用的函数和宏。

这些头文件主要用于 Linux 系统上进行特定的功能和操作,与 Linux 操作系统的特性和功能紧密相关。

五、常用头文件功能速览
这一小节用来速览各个常用头文件的用处,主要列出各个头文件定义了哪些函数、宏等。

不写具体的函数原型了,IDE里面自己看,这个太多了。

5.1 通用常用头文件
01. stdio.h——标准输入输出
stdio.h 提供了标准输入输出函数的声明、定义和相关宏定义。

stdio.h 头文件定义了许多用于输入和输出的函数、宏和类型。下面是一些 stdio.h 中常用的函数和宏:

输入输出函数:

printf:格式化输出到标准输出流。
scanf:从标准输入流中读取格式化输入。
puts:输出字符串到标准输出流并追加换行符。
gets:从标准输入流中读取一行字符串(不建议使用,容易导致缓冲区溢出)。
fgets:从指定的输入流中读取一行字符串,包括换行符。
fputc 和 fgetc:将字符写入和从指定的文件流读取字符。
文件操作:

fopen:打开一个文件。
fclose:关闭一个文件。
fread 和 fwrite:从文件读取数据和将数据写入文件。
fprintf:将格式化数据写入文件。
宏定义:

stdin、stdout 和 stderr:表示标准输入、标准输出和标准错误输出流的文件指针。
EOF:表示文件结束符。
BUFSIZ:定义了标准 I/O 缓冲区的大小。
NULL:表示空指针。
除了上述函数和宏之外,stdio.h 还定义了其他用于文件操作、缓冲区控制、格式化输入输出的函数和类型。

02. stdlib.h——内存管理与分配、随机数、字符串转换
stdlib.h 提供了一些常用的函数、类型和宏定义,用于内存管理、随机数生成、字符串转换、动态内存分配等操作。

下面是一些常见的函数和宏定义,位于 stdlib.h 头文件中:

内存管理:

malloc:分配指定大小的内存块。
calloc:分配并清零指定数量的内存块。
realloc:重新分配已分配内存块的大小。
free:释放先前分配的内存块。
字符串转换:

atoi:将字符串转换为整数。
atol:将字符串转换为长整数。
atof:将字符串转换为浮点数。
itoa:将整数转换为字符串。
伪随机数生成:

rand:生成一个伪随机整数。
srand:设置随机数生成的种子值。
程序控制:

exit:终止程序的执行。
abort:异常终止程序的执行。
动态内存分配:

malloc、calloc、realloc 和 free 函数可以用于动态地分配和释放内存。
其他函数和宏:

system:执行系统命令。
abs:返回一个整数的绝对值。
rand 和 srand:用于生成伪随机数。
stdlib.h 中还定义了一些与整数、文件处理、排序(如qsort函数)等相关的函数和常量。

03. string.h——字符串处理
string.h 提供了字符串处理相关的函数和宏定义。

下面是一些常见的函数和宏定义,位于 string.h 头文件中:

字符串操作:

strcpy:将一个字符串复制到另一个字符串。
strncpy:复制指定长度的字符串到另一个字符串。
strcat:将一个字符串追加到另一个字符串。
strncat:将指定长度的字符串追加到另一个字符串。
strcmp:比较两个字符串的大小。
strncmp:比较指定长度的两个字符串的大小。
strlen:计算字符串的长度。
strchr:在字符串中查找指定字符的第一次出现。
strstr:在字符串中查找指定子字符串的第一次出现。
内存操作:

memset:将指定的内存块设置为指定的值。
memcpy:将一个内存块的内容复制到另一个内存块。
memmove:将一个内存块的内容移动到另一个内存块。
字符串转换和操作:

atoi:将字符串转换为整数。
atol:将字符串转换为长整数。
atof:将字符串转换为浮点数。
itoa:将整数转换为字符串。
strtok:将字符串分解为一系列标记。
其他函数和宏:

strcmp、strncmp、strlen 等函数用于字符串比较和长度计算。
memset、memcpy、memmove 等函数用于内存操作。
string.h 还定义了一些与字符处理和字符串操作相关的宏,如 NULL(表示空指针)、EOF(表示文件结束符)等。

04. math.h——数学
math.h 提供了数学相关的函数和常量。

下面是一些常见的函数和常量,位于 math.h 头文件中:

常见数学函数:

sqrt:计算平方根。
pow:计算幂运算。
exp:计算指数函数。
log:计算自然对数。
sin、cos、tan:计算三角函数(正弦、余弦、正切)。
asin、acos、atan:计算反三角函数。
ceil:向上取整。
floor:向下取整。
round:四舍五入。
abs:计算绝对值。
fmod:计算浮点数的余数。
常量:

M_PI:圆周率 π 的近似值。
M_E:自然对数的底数 e 的近似值。
math.h 中还定义了其他数学函数和常量,用于数值计算、三角函数、对数函数、幂运算、取整等操作。


上面4个头文件是100%的程序会用到的(至少一个)。
05. time.h——时间和日期
time.h 提供了时间和日期相关的函数和类型。

下面是一些常见的函数和类型,位于 time.h 头文件中:

时间获取和转换:

time:获取当前的系统时间,返回从 1970 年 1 月 1 日 00:00:00 UTC 到当前时间的秒数。
difftime:计算两个时间之间的差值,以秒为单位。
mktime:将时间和日期转换为从 1970 年 1 月 1 日 00:00:00 UTC 开始的秒数。
localtime:将时间表示为本地时间的结构体。
gmtime:将时间表示为协调世界时(UTC)的结构体。
时间格式化:

strftime:将时间转换为指定格式的字符串。
asctime:将时间转换为可读的字符串表示。
ctime:将时间转换为可读的字符串表示,与 asctime 类似。
延时函数:

sleep:使程序暂停指定的秒数。
时间类型:

time_t:表示从 1970 年 1 月 1 日 00:00:00 UTC 开始的秒数。
struct tm:表示日期和时间的结构体。
通过包含 time.h 头文件,可以使用其中定义的函数和类型来进行时间获取、时间转换、时间格式化和延时等操作。这些函数和类型可以用于编写与时间相关的程序,例如日期计算、定时任务、日志记录等。

06. ctype.h——字符处理
ctype.h 提供了字符处理相关的函数和宏定义。

下面是一些常见的函数和宏定义,位于 ctype.h 头文件中:

字符分类函数:

isalnum:检查字符是否是字母或数字。
isalpha:检查字符是否是字母。
isdigit:检查字符是否是数字。
islower:检查字符是否是小写字母。
isupper:检查字符是否是大写字母。
isspace:检查字符是否为空格字符。
ispunct:检查字符是否是标点符号。
isxdigit:检查字符是否是十六进制数字。
isblank:检查字符是否为空白字符(空格或制表符)。
字符转换函数:

tolower:将字符转换为小写字母。
toupper:将字符转换为大写字母。
其他函数和宏:

isascii:检查字符是否是 ASCII 字符。
isgraph:检查字符是否是可打印字符。
iscntrl:检查字符是否是控制字符。
isprint:检查字符是否是可打印字符(包括空格)。
ctype.h 还定义了一些字符处理相关的宏,如 EOF(表示文件结束符)、NULL(表示空指针)等。

通过包含 ctype.h 头文件,可以使用其中定义的函数和宏来进行字符分类、字符转换和字符处理等操作。这些函数和宏可以用于判断字符的属性、进行字符转换和字符处理,有助于编写文本处理、输入验证和字符操作等相关的程序。

07. stdbool.h——布尔类型
<stdbool.h> 提供了布尔类型和相关操作的定义和支持。

类型定义:

bool:布尔类型,表示真(true)或假(false)的逻辑值。
常量:

true:布尔类型的真值常量,等价于非零值。
false:布尔类型的假值常量,等价于零值。
逻辑运算符:

逻辑非:! 运算符,对布尔类型的操作数进行逻辑取反。
逻辑与:&& 运算符,对两个布尔类型的操作数进行逻辑与操作。
逻辑或:|| 运算符,对两个布尔类型的操作数进行逻辑或操作。
08. errno.h——错误处理
errno.h 提供了错误处理相关的宏定义和全局变量。

全局变量:

errno:表示当前错误码的全局变量。它是一个整数类型的变量,在发生错误时会被设置为对应的错误码。
宏定义:

EDOM:表示数学域错误。
ERANGE:表示结果溢出或超出范围错误。
函数:

无。
错误处理:
C 标准库中的一些函数在发生错误时会设置 errno 变量,以指示错误的类型。通过检查 errno 变量的值,可以确定具体的错误类型,并采取相应的处理措施。一般情况下,errno 的值只在函数执行失败时才有意义。

示例用法:

#include <stdio.h>
#include <errno.h>

int main() {
    FILE* file = fopen("nonexistent.txt", "r");
    if (file == NULL) {
        printf("Error opening file: %d\n", errno);
    }

    return 0;
}

在上述示例中,当文件打开失败时,fopen 函数会设置 errno 变量,表示文件打开错误的具体类型。通过打印 errno 的值,可以获得相应的错误码,从而进行适当的错误处理。

注意:在使用 errno 变量之前,需要包含 <errno.h> 头文件。另外,errno 的值在不同的操作系统和编译器中可能具有不同的含义,请参考相关文档以了解特定平台的错误码及其对应的含义。

09. float.h——浮点数类型限定和属性
float.h 用于定义浮点数类型的特定限制和属性。它提供了有关浮点数类型的一些重要信息和常量。下面是一些常用的常量和属性:

浮点数类型属性:

FLT_RADIX:指定浮点数的基数,通常为 2。
FLT_MANT_DIG:指定 float 类型的尾数位数。
FLT_DIG:指定 float 类型的十进制精度。
FLT_MIN_EXP:float 类型的最小负指数。
FLT_MAX_EXP:float 类型的最大正指数。
FLT_MIN_10_EXP:float 类型的最小负十进制指数。
FLT_MAX_10_EXP:float 类型的最大正十进制指数。
float 类型的范围和精度:

FLT_MIN:float 类型的最小正数值。
FLT_MAX:float 类型的最大正数值。
FLT_EPSILON:float 类型的最小可表示的绝对误差。
double 类型的范围和精度:

DBL_MIN:double 类型的最小正数值。
DBL_MAX:double 类型的最大正数值。
DBL_EPSILON:double 类型的最小可表示的绝对误差。
long double 类型的范围和精度:

LDBL_MIN:long double 类型的最小正数值。
LDBL_MAX:long double 类型的最大正数值。
LDBL_EPSILON:long double 类型的最小可表示的绝对误差。
这些常量和属性可用于编写处理浮点数的代码,并提供关于浮点数类型的范围、精度和特性的信息。请注意,浮点数的实际范围和精度可能因系统而异,因为它们是实现相关的。

10. limits.h——各种类型变量的最值
limits.h用于定义各种基本数据类型的实现特定限制。它提供了代表不同类型变量中可存储的最小值和最大值的常量。以下是 limits.h 中常用的一些常量:

CHAR_BIT:该常量表示 char 数据类型中的位数,通常为 8。

整数类型的限制:

CHAR_MIN 和 CHAR_MAX:char 数据类型的最小值和最大值。
SHRT_MIN 和 SHRT_MAX:short (short int) 数据类型的最小值和最大值。
INT_MIN 和 INT_MAX:int 数据类型的最小值和最大值。
LONG_MIN 和 LONG_MAX:long (long int) 数据类型的最小值和最大值。
LLONG_MIN 和 LLONG_MAX:long long (long long int) 数据类型的最小值和最大值。
无符号整数类型的限制:

UCHAR_MAX:无符号 char 的最大值。
USHRT_MAX:无符号 short 的最大值。
UINT_MAX:无符号 int 的最大值。
ULONG_MAX:无符号 long 的最大值。
ULLONG_MAX:无符号 long long 的最大值。
MB_LEN_MAX:多字节字符中的最大字节数。

这些常量可用于 C 程序中,以确保可移植性并编写与底层系统的数据类型限制无关的代码。通过引用这些常量,可以确保程序在不同平台上表现一致。

11. stddef.h
stddef.h 提供了一些与指针和宏相关的类型和常量定义。它定义了一些重要的符号常量和类型,用于帮助编写可移植的代码。以下是 stddef.h 中常用的一些定义:

NULL:这是一个宏,用于表示空指针常量。

size_t:这是一个无符号整数类型,在 C 语言中用于表示对象的大小。例如,sizeof 运算符返回的结果类型就是 size_t。

ptrdiff_t:这是一个有符号整数类型,用于表示两个指针之间的差值。

offsetof 宏:这是一个用于计算结构体成员在结构体中的偏移量的宏。它接受一个结构体类型和一个成员名作为参数,并返回该成员在结构体中的偏移量。

这些定义和宏可用于编写可移植的代码,特别是在涉及指针、数组和结构体的情况下。它们提供了一种标准化的方式来处理对象大小、指针差值和结构体成员的偏移量,以便程序在不同的平台上表现一致。

12. stdarg.h——处理可变数量参数
stdarg.h 用于处理可变数量的参数函数。它提供了一组宏和类型,使得函数能够接受不定数量的参数。以下是 stdarg.h 中常用的一些定义:

va_list:这是一个类型,用于声明可变数量参数列表的对象。

va_start 宏:它用于初始化可变参数列表。它接受两个参数,第一个是 va_list 对象,第二个是可变参数列表的前一个已知参数。

va_arg 宏:它用于访问可变参数列表中的下一个参数,并指定参数的类型。它接受两个参数,第一个是 va_list 对象,第二个是参数的类型。每次调用 va_arg 都会返回下一个参数,并将 va_list 对象更新为指向列表中的下一个参数。

va_end 宏:它用于清理可变参数列表相关的资源。它接受一个参数,即 va_list 对象,用于标记列表的结束。

这些宏和类型允许在函数中接受可变数量的参数,而不需要提前知道参数的个数。它们非常有用,例如在实现可变参数的函数,如 printf 或 scanf 时。通过使用 stdarg.h 中的宏和类型,可以安全地访问可变数量的参数,并灵活地处理它们。

13. signal.h——信号处理
以下是 signal.h 中常用的一些函数和宏:

signal 函数:该函数用于注册信号处理器(Signal Handler)以响应特定的信号。它接受两个参数,第一个参数是信号编号,第二个参数是指向信号处理器函数的指针。

raise 函数:该函数用于向当前进程发送信号。它接受一个参数,即要发送的信号编号。

SIG_ERR 宏:用于表示信号处理器注册失败的返回值。

一些信号编号的宏:例如 SIGINT、SIGABRT、SIGSEGV 等,用于表示特定的信号。

通过使用 signal.h 中的函数和宏,可以处理来自操作系统或其他进程的信号,以实现对信号事件的响应和处理。

信号是在操作系统中用于通知进程发生某种事件的机制,例如用户按下中断键、进程出现错误或其他进程发送了一个特定信号等。通过注册信号处理器函数,可以捕获并对这些事件做出适当的响应,以便更好地控制程序的行为和处理异常情况。

14. locale.h——本地化
locale.h 用于处理与本地化(国际化)相关的操作。它提供了一些函数和类型,用于控制程序的本地化设置,包括日期、时间、货币和语言等。

以下是 locale.h 中常用的一些函数和类型:

setlocale 函数:该函数用于设置程序的本地化区域设置。它接受两个参数,第一个参数是 int 类型,用于指定本地化的分类,如日期、时间、货币等;第二个参数是一个字符串,用于指定要设置的区域设置。

localeconv 函数:该函数返回一个指向 struct lconv 类型的指针,包含了本地化相关的货币和数值格式信息。

struct lconv:这是一个结构体类型,包含了本地化相关的货币和数值格式信息。它的成员可以用于获取和设置货币符号、小数点符号、千位分隔符等。

一些定义的常量:LC_ALL、LC_COLLATE、LC_CTYPE、LC_MONETARY、LC_NUMERIC 和 LC_TIME,用于指定 setlocale 函数中的本地化分类。

使用 locale.h 中的函数和类型,您可以根据不同的本地化需求,调整程序的输出格式、日期时间格式、货币

5.2 windows常用头文件
挑几个介绍吧。

01. windows.h——窗口、进程、线程
windows.h 是用于 Windows 平台的 C 和 C++ 程序开发的头文件。它包含了许多 Windows API 函数和宏定义,用于操作和管理 Windows 操作系统的各个方面。以下是 windows.h 中一些常用的内容:

窗口和消息相关的函数和宏:

CreateWindowEx:用于创建窗口。
RegisterClassEx:用于注册窗口类。
GetMessage 和 DispatchMessage:用于处理消息循环。
SendMessage 和 PostMessage:用于发送消息到窗口过程。
DefWindowProc:默认的窗口过程函数。
文件和文件系统相关的函数和宏:

CreateFile 和 CloseHandle:用于创建和关闭文件句柄。
ReadFile 和 WriteFile:用于读取和写入文件内容。
FindFirstFile 和 FindNextFile:用于查找文件和目录。
SetFileAttributes 和 GetFileAttributes:用于设置和获取文件属性。
进程和线程相关的函数和宏:

CreateProcess 和 TerminateProcess:用于创建和终止进程。
GetCurrentProcess 和 GetCurrentThread:用于获取当前进程和线程的句柄。
CreateThread 和 ExitThread:用于创建和退出线程。
Sleep 和 WaitForSingleObject:用于控制线程的等待和延迟。
动态链接库(DLL)相关的函数和宏:

LoadLibrary 和 FreeLibrary:用于加载和释放 DLL。
GetProcAddress:用于获取 DLL 中的函数地址。
此外,windows.h 还包含了许多其他用于操作窗口、图形、网络、注册表、安全性等方面的函数和宏定义。它是 Windows 平台上开发 Windows 应用程序和系统级软件的关键头文件之一。通过使用 windows.h,开发者可以访问 Windows API,并利用丰富的功能和特性来创建强大的 Windows 应用程序。

02. winsock2.h——windows网络套接字
winsock2.h 是 Windows 平台上用于网络编程的头文件。它提供了许多函数、结构体和常量,用于创建和管理网络套接字(sockets),实现网络通信。winsock2.h 是在 Windows Sockets 2(Winsock2)规范下开发网络应用程序的关键头文件。

以下是 winsock2.h 中一些常用的内容:

套接字相关的函数和结构体:

socket:创建套接字。
bind 和 connect:绑定或连接套接字。
listen 和 accept:监听和接受连接。
send 和 recv:发送和接收数据。
closesocket:关闭套接字。
地址和协议相关的结构体和常量:

sockaddr 和 sockaddr_in:用于表示套接字地址信息。
AF_INET 和 AF_INET6:表示 IPv4 和 IPv6 地址族。
SOCK_STREAM 和 SOCK_DGRAM:表示 TCP 和 UDP 套接字类型。
IPPROTO_TCP 和 IPPROTO_UDP:表示 TCP 和 UDP 协议。
初始化和清理函数:

WSAStartup 和 WSACleanup:初始化和清理 Winsock 库。
通过使用 winsock2.h 中的函数、结构体和常量,开发者可以创建网络应用程序,实现数据的传输和通信。它提供了对套接字编程的支持,使您能够创建网络连接、发送和接收数据、处理网络事件等。winsock2.h 是开发 Windows 平台上网络应用程序的重要组成部分,并且与其他网络库(如 TCP/IP)集成使用,以构建功能丰富的网络应用。

更高级的还有:mswsock.h

03. shellapi.h——shell编程
shellapi.h 是 Windows 平台上用于 Shell 编程的头文件。它提供了一些函数和结构体,用于与操作系统的 Shell 执行交互,包括文件操作、快捷方式管理、系统托盘图标等。

以下是 shellapi.h 中一些常用的内容:

文件和文件夹操作函数:

ShellExecute:打开文件、文件夹或运行应用程序。
SHGetFolderPath:获取特定文件夹路径。
SHCreateDirectoryEx:创建目录。
SHFileOperation:执行文件和文件夹的操作,如复制、移动、删除等。
快捷方式和图标管理函数:

SHGetSpecialFolderPath:获取特殊文件夹路径,如桌面、开始菜单等。
SHGetFileInfo:获取文件或文件夹的图标和其他属性信息。
SHCreateShortcut:创建快捷方式。
SHChangeNotify:通知系统有关文件和文件夹的更改。
系统托盘图标函数:

Shell_NotifyIcon:在系统托盘中显示和管理图标。
Shell_NotifyIconGetRect:获取系统托盘的位置和尺寸。
通过使用 shellapi.h 中的函数和结构体,开发者可以与 Windows Shell 进行交互,实现文件操作、快捷方式管理、系统托盘图标等功能。它为应用程序提供了与操作系统桌面环境的集成,使您能够执行与文件、文件夹和系统界面相关的操作。shellapi.h 是开发 Windows 平台上与 Shell 相关功能的重要头文件之一,为开发者提供了方便而强大的 Shell 编程接口。

5.3 Linux常用头文件
01. unistd.h——系统相关(进程、文件等)
unix standrad.

unistd.h 用于提供对操作系统服务的访问和控制。尽管它是在类 Unix 系统上常见的头文件,但它并不是标准的 C 或 C++ 头文件,而是与操作系统相关的特定头文件。

以下是 unistd.h 中一些常见的功能和函数:

系统调用和进程控制:

fork:创建一个子进程。
exec 系列函数:在当前进程中执行新的程序。
exit:终止当前进程的执行。
getpid 和 getppid:获取当前进程和父进程的进程 ID。
文件和目录操作:

open 和 close:打开和关闭文件。
read 和 write:从文件中读取和写入数据。
lseek:移动文件指针。
access:检查文件的访问权限。
mkdir 和 rmdir:创建和删除目录。
系统资源管理:

sleep:使当前进程挂起指定的时间。
getcwd:获取当前工作目录。
chdir:改变当前工作目录。
gethostname:获取主机名。
getlogin:获取登录名。
进程间通信(IPC):

pipe:创建一个管道用于进程间通信。
dup 和 dup2:复制文件描述符。
fork 和 exec 系列函数:在进程间传递状态和数据。
unistd.h 提供了对类 Unix 系统的许多常见功能的访问,使程序能够与操作系统进行交互,并进行进程管理、文件操作和系统资源管理。需要注意的是,unistd.h 在不同的类 Unix 系统上可能会有所不同,因此一些函数和功能在特定系统上可能不可用或有不同的行为。

02. fcntl.h——文件操作
fcntl.h 用于提供对文件描述符的控制和和操作。它定义了一些常量和函数,用于控制文件的属性、打开和关闭文件以及文件锁定等操作。

以下是 fcntl.h 中一些常见的功能和函数:

文件控制:

open:打开文件并返回一个文件描述符。
creat:创建一个新文件。
close:关闭文件。
文件状态标志(File Status Flags):

O_RDONLY、O_WRONLY、O_RDWR:打开文件的读取、写入、读写模式。
O_APPEND:追加写入文件。
O_CREAT、O_EXCL:创建文件并验证文件不存在。
O_TRUNC:将文件截断为零长度。
文件控制操作:

fcntl:对文件描述符进行各种控制操作。
dup、dup2:复制文件描述符。
文件锁定:

flock:对文件进行简单的全局锁定。
fcntl:使用 F_SETLK、F_SETLKW 等命令进行更复杂的文件锁定。
fcntl.h 提供了一些用于文件描述符控制和操作的函数和常量,使程序能够在类 Unix 系统上对文件进行更精细的控制和操作。需要注意的是,fcntl.h 在不同的类 Unix 系统上可能会有所不同,因此一些函数和常量的行为可能会有所差异。

03. sys/types.h——操作系统相关的数据类型定义
sys/types.h 用于定义一些基本数据类型和数据结构。它包含了一些与操作系统相关的数据类型和宏定义,以便在编程中使用。

以下是 sys/types.h 中一些常见的内容:

数据类型定义:

size_t:用于表示对象的大小。
ssize_t:用于表示有符号的对象大小。
time_t:用于表示时间值。
off_t:用于表示文件偏移量。
pid_t:用于表示进程 ID。
uid_t 和 gid_t:用于表示用户 ID 和组 ID。
文件类型和模式定义:

mode_t:用于表示文件的权限模式。
dev_t:用于表示设备的标识符。
其他常见的数据类型和宏:

int8_t、int16_t、int32_t、int64_t:用于表示固定大小的整数类型。
intptr_t 和 uintptr_t:用于表示指针类型的整数值。
NULL:表示空指针常量。
sys/types.h 提供了一些与操作系统相关的数据类型定义,为程序提供了可移植性和代码可读性。通过包含 sys/types.h 头文件,可以使用其中定义的数据类型和宏,以便在类 Unix 系统上进行编程和开发。需要注意的是,sys/types.h 是与操作系统相关的头文件,在不同的操作系统上可能会有所不同。

04. sys/stat.h——文件状态
sys/stat.h 用于获取文件和文件系统的状态信息。它定义了一些常量和结构体,用于描述文件的属性、权限、时间戳等信息。

以下是 sys/stat.h 中一些常见的内容:

文件访问权限:

S_IRUSR、S_IWUSR、S_IXUSR:用户(所有者)的读、写、执行权限。
S_IRGRP、S_IWGRP、S_IXGRP:用户组的读、写、执行权限。
S_IROTH、S_IWOTH、S_IXOTH:其他用户的读、写、执行权限。
文件类型和模式:

S_IFMT:用于提取文件类型的位掩码。
S_IFREG、S_IFDIR、S_IFLNK 等:表示不同文件类型的位掩码。
S_ISREG()、S_ISDIR()、S_ISLNK() 等:用于检查文件类型的宏。
文件状态结构体:

struct stat:用于描述文件的状态信息,包括文件大小、权限、时间戳等。
文件属性获取函数:

stat、lstat:获取文件的状态信息。
fstat:获取打开文件的状态信息。
sys/stat.h 提供了一些用于获取文件状态信息的常量、结构体和函数,使程序能够获取和操作文件的属性和权限等信息。通过包含 sys/stat.h 头文件,可以在类 Unix 系统上进行文件和文件系统相关的编程和开发。需要注意的是,sys/stat.h 是与操作系统相关的头文件,在不同的操作系统上可能会有所不同。

05. sys/socket.h——套接字
sys/socket.h 主要作用是定义了与套接字(socket)相关的各种数据类型、常量和函数,包含了许多网络编程所需的头文件。

“sys/socket.h” 中包含的函数和常量如下:

函数:

socket():创建一个新的套接字
bind():将套接字绑定到地址指定的端口号
listen():监听套接字上的连接请求
accept():接收客户端的连接请求
connect():建立与远程服务器的连接
recv():从套接字中接收数据
send():将数据发送到套接字
close():关闭一个套接字
shutdown():关闭一个已建立的连接(这两个有区别,本文暂不不讲解)
常量:

AF_INET:IPv4 协议的地址族,又称为 Internet 地址族
AF_UNIX:Unix 协议的地址族
SOCK_STREAM:提供面向连接、可靠的数据传输服务的套接字类型
SOCK_DGRAM:提供面向无连接、不可靠的数据传输服务的套接字类型
IPPROTO_TCP:TCP 协议的协议号
IPPROTO_UDP:UDP 协议的协议号
除此之外,“sys/socket.h” 中还定义了一些结构体如 sockaddr、sockaddr_in 等,这些结构体用于套接字地址的表示和传输。使用这些结构体可以更方便地操作套接字地址。

“sys/socket.h” 和 “winsock2.h” 都是用于进行套接字编程的头文件,但它们之间有几个重要的差异。

操作系统平台不同
“sys/socket.h” 是 UNIX 和 Linux 等类 UNIX 操作系统的头文件,而 “winsock2.h” 则是 Windows 操作系统的头文件。

函数调用方式不同
UNIX 系统上使用标准的函数调用方式来执行套接字操作,而 Windows 系统上则使用 Windows 套接字 API (也称为 Winsock)。

数据类型不同
“sys/socket.h” 和 “winsock2.h” 定义了不同的数据类型,例如 “struct sockaddr” 和"SOCKADDR" 表示套接字地址的结构体,在 UNIX 系统上使用前者,在 Windows 上使用后者。

常量和枚举值不同
“sys/socket.h” 和 “winsock2.h” 中定义的常量和枚举值也不同,例如在 UNIX 系统上使用 AF_INET 表示IPv4 地址族,在 Windows 系统上则使用 AF_INET 或 AF_INET6(表示 IPv6 地址族)。

06. sys/time.h——处理时间
sys/time.h 用于处理时间和时间相关的操作。它定义了一些与时间和时间操作相关的结构体、常量和函数。

以下是 sys/time.h 中一些常见的内容:

时间结构体:

struct timeval:表示时间值,包括秒数和微秒数。
时间获取函数:

gettimeofday:获取当前时间。
定时器操作函数:

timeradd、timersub、timerclear:对时间进行加法、减法和清零操作。
时间转换函数:

gmtime、localtime:将时间转换为本地时间或协调世界时(UTC)时间。
strftime:将时间格式化为字符串。
sys/time.h 提供了一些用于处理时间和时间操作的结构体和函数,使程序能够获取、操作和转换时间。通过包含 sys/time.h 头文件,可以在类 Unix 系统上进行与时间相关的编程和开发。需要注意的是,sys/time.h 是与操作系统相关的头文件,在不同的操作系统上可能会有所不同。

sys/time.h 和 time.h 都是用于处理时间和时间相关操作的头文件,但它们在功能和使用上有一些区别。

sys/time.h 是一个系统头文件,在类 Unix系统中使用。它提供了对时间的更底层的处理,包括获取当前时间、定时器操作、时间结构体等。它通常用于需要更高精度或更底层的时间操作,比如微秒级的计时和定时器功能。

time.h 是标准 C 库中的头文件,提供了与时间相关的基本函数和结构体。它包含了用于获取当前时间、时间格式化、时间转换等功能,如 time、localtime、strftime 等函数。它在标准 C 环境下使用,并且提供了对时间的常见操作的抽象。

07. sys/wait.h——处理进程状态和等待
sys/wait.h 用于处理进程的状态和等待相关的操作。它定义了一些常量和函数,使程序能够等待子进程的状态改变、获取子进程的退出状态等。

以下是 sys/wait.h 中一些常见的内容:

子进程状态常量:

WIFEXITED(status):检查子进程是否正常退出。
WEXITSTATUS(status):获取子进程的退出状态。
WIFSIGNALED(status):检查子进程是否因信号而终止。
WTERMSIG(status):获取导致子进程终止的信号编号。
WIFSTOPPED(status):检查子进程是否暂停。
WSTOPSIG(status):获取导致子进程暂停的信号编号。
等待子进程的状态改变:

wait:等待任意子进程的状态改变。
waitpid:等待指定子进程的状态改变。
sys/wait.h 提供了一些用于处理进程状态和等待子进程的函数和常量,使程序能够控制和监视子进程的执行状态。通过包含 sys/wait.h 头文件,可以在类 Unix 系统上进行与进程状态相关的编程和开发。需要注意的是,sys/wait.h 是与操作系统相关的头文件,在不同的操作系统上可能会有所不同。

它通常与下面的头文件一起使用:

08. pthread.h——POSIX线程编程
pthread.h 用于支持 POSIX 线程(POSIX Threads)编程。它定义了一些数据类型、常量和函数,用于创建、管理和同步多线程程序。

以下是 pthread.h 中一些常见的内容:

线程管理函数:

pthread_create:创建一个新线程。
pthread_exit:终止当前线程。
pthread_join:等待指定线程的结束。
pthread_detach:将线程设置为可分离状态,使其在退出时自动释放资源。
线程同步函数:

pthread_mutex_init、pthread_mutex_destroy:初始化和销毁互斥锁。
pthread_mutex_lock、pthread_mutex_unlock:对互斥锁进行加锁和解锁操作。
pthread_cond_init、pthread_cond_destroy:初始化和销毁条件变量。
pthread_cond_wait、pthread_cond_signal:等待和通知条件变量的变化。
线程属性操作:

pthread_attr_init、pthread_attr_destroy:初始化和销毁线程属性。
pthread_attr_getdetachstate、pthread_attr_setdetachstate:获取和设置线程的分离状态。
线程局部存储:

pthread_key_create、pthread_key_delete:创建和删除线程局部存储键。
pthread_setspecific、pthread_getspecific:设置和获取线程局部存储的值。
pthread.h 提供了一些用于多线程编程的函数和常量,使程序能够创建、管理和同步多个并发执行的线程。通过包含 pthread.h 头文件,可以在类 Unix 系统上进行多线程编程和开发。需要注意的是,pthread.h 是与 POSIX 线程编程相关的头文件,在不同的操作系统上可能会有所不同。

09. signal.h——信号处理
signal.h 用于处理信号(Signals)和信号处理器(Signal Handlers)。信号是在计算机系统中用于通知进程发生了某些事件或异常的机制。

以下是 signal.h 中一些常见的内容:

信号处理函数:

signal:设置信号处理器(Signal Handler)。
raise:向当前进程发送指定信号。
信号常量:

SIGINT、SIGTERM、SIGQUIT:表示用户发送的中断、终止、退出信号。
SIGSEGV、SIGILL、SIGFPE:表示发生的错误信号,如段错误、非法指令、浮点异常等。
SIGUSR1、SIGUSR2:表示用户自定义的信号。
信号处理器的行为:

SIG_DFL:默认的信号处理器。
SIG_IGN:忽略该信号。
通过使用 signal.h 头文件,可以为程序中的特定信号注册信号处理器,并定义对这些信号的处理行为。当程序接收到注册的信号时,信号处理器将被调用,从而可以执行自定义的处理逻辑,比如优雅地关闭程序、处理异常情况等。

信号处理是一个底层的机制,对于复杂的异步事件处理,通常会选择使用更高级的机制,如多线程或异步编程。然而,在某些情况下,信号处理可以提供一种简单有效的方式来处理一些特定类型的事件或异常。

signal.h 头文件定义的信号处理函数和信号常量在标准 C 和 POSIX 标准中是通用的,不仅适用于 Linux,还适用于其他类 Unix 操作系统,例如 macOS、FreeBSD、Solaris 等。

虽然信号处理机制是 POSIX 标准的一部分,但是不同的操作系统可能会有一些差异和特定的信号。因此,需要根据特定的操作系统来确定可用的信号和其对应的常量。

此外,不同的操作系统可能对信号处理器的行为有一些特定规定或扩展。因此,在编写跨平台的代码时,需要谨慎处理信号处理的相关逻辑,并参考各个操作系统的文档以确保代码在不同平台上的正确性和可移植性。

在 Windows 系统中,信号处理的机制与类 Unix 系统有所不同。Windows 平台使用的是事(Event)和消息(Message)机制来处理类似于信号的异步事件和通知。

Windows 提供了一系列与异步事件处理相关的函数和机制,例如 SetEvent、WaitForSingleObject 、MsgWaitForMultipleObjects 等。这些函数可以用于等待和触发事件,并实现类似于信号处理的功能。

相应地,Windows 平台使用不同于 signal.h 的头文件和函数来处理异步事件和通知。例如,Windows API 中的 SetConsoleCtrlHandler 函数可以用于设置控制台的控制事件处理器,以便捕获和处理控制台事件,如 Ctrl+C 或 Ctrl+Break。此外,Windows 程序通常使用消息循环和消息处理函数来处理窗口消息和用户交互事件。

10. dlfcn.h——动态链接库
dlfcn.h 用于动态链接库(Dynamic Linking)的加载和函数调用。它提供了一组函数和数据类型,使程序能够在运行时动态地加载共享库(也称为动态链接库或共享对象)并使用其中的函数。

以下是 dlfcn.h 中一些常见的内容:

动态库加载和卸载函数:

dlopen:打开一个动态链接库。
dlclose:关闭一个已打开的动态链接库。
符号获取函数:

dlsym:在动态链接库中查找指定名称的符号(函数、变量等)。
错误处理函数:

dlerror:获取最近一次动态链接库相关操作的错误信息。
使用 dlfcn.h 头文件可以让程序在运行时加载和使用共享库,动态地调用其中的函数或获取变量的地址。这在需要在程序运行过程中动态加载和使用外部库的情况下非常有用,例如插件系统、动态加载的驱动程序等。

,dlfcn.h 是一个非标准的头文件,它在类 Unix 系统上比较常见,如 Linux、macOS、FreeBSD 等,但在其他操作系统上可能不可用或存在差异。在使用 dlfcn.h 中的函数时,需要注意兼容性和平台特定的差异。

如果您发现该资源为电子书等存在侵权的资源或对该资源描述不正确等,可点击“私信”按钮向作者进行反馈;如作者无回复可进行平台仲裁,我们会在第一时间进行处理!

评价 0 条
风晓
粉丝 1 资源 2038 + 关注 私信
最近热门资源
当“ventoy启动盘”遇到“主板安全启动”  404
最近下载排行榜
当“ventoy启动盘”遇到“主板安全启动” 0
作者收入月榜
1

prtyaa 收益354.19元

2

风晓 收益207.84元

3

IT-feng 收益197.65元

4

zlj141319 收益173.23元

5

777 收益169.89元

6

1843880570 收益160.33元

7

信创来了 收益103.8元

8

Fhawking 收益99.6元

9

克里斯蒂亚诺诺 收益91.08元

10

技术-小陈 收益79元

请使用微信扫码