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

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

一、Introduction

1.1 C语言标准库

1.2 历代C语言标准

1.3 主流C语言编译器

二、C语言标准库

2.1 常用标准头文件

2.2 常用标准静态库

三、windows平台

四、Linux平台

五、常用头文件功能速览

5.1 通用常用头文件

01. stdio.h——标准输入输出

02. stdlib.h——内存管理与分配、随机数、字符串转换

03. string.h——字符串处理

04. math.h——数学

05. time.h——时间和日期

06. ctype.h——字符处理

07. stdbool.h——布尔类型

08. errno.h——错误处理

09. float.h——浮点数类型限定和属性

10. limits.h——各种类型变量的最值

11. stddef.h

12. stdarg.h——处理可变数量参数

13. signal.h——信号处理

14. locale.h——本地化

5.2 windows常用头文件

01. windows.h——窗口、进程、线程

02. winsock2.h——windows网络套接字

03. shellapi.h——shell编程

5.3 Linux常用头文件

01. unistd.h——系统相关(进程、文件等)

02. fcntl.h——文件操作

03. sys/types.h——操作系统相关的数据类型定义

04. sys/stat.h——文件状态

05. sys/socket.h——套接字

06. sys/time.h——处理时间

07. sys/wait.h——处理进程状态和等待

08. pthread.h——POSIX线程编程

09. signal.h——信号处理

10. dlfcn.h——动态链接库


一、Introduction

1.1 C语言标准库

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


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


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


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


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


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


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


1.2 历代C语言标准

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


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


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


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


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


5.C2x:正在制定中。

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


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

917445ff57f213009a81d9cbaa401783_0d5b2de5d1a74bc9ac229cd6a80f0dfb.png

1.3 主流C语言编译器

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


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


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


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


4.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

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

int n = 10;
char str[n] = {};

可以通过扩展安装clang扩展,或者添加外部工具来使用gcc或者clang(这一点或许vs code更方便)。


二、C语言标准库

2.1 常用标准头文件

对于标准头文件,在程序中引用即可,如:

#include<limits.h>
  • 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语言标准静态库:


1.libc.a:C语言标准库的核心部分,提供了输入输出函数、字符串处理函数、内存管理函数等基本功能。

2.libm.a:数学库,包含了数学函数,如三角函数、指数函数、对数函数等。

3.libpthread.a:线程库,提供了线程相关的函数和类型,用于多线程编程。

4.libdl.a:动态链接库支持库,提供了动态链接库的相关函数和类型。

5.librt.a:实时库,提供了实时相关的函数和类型,如定时器函数、时间操作函数等。

6.libcrypt.a:密码库,提供了密码相关的函数和类型,如加密和解密函数。

7.在C语言代码中连接静态库有几种常用的方法。


一种是使用#pragma comment宏来导入静态库;

另一种方法是在项目属性中配置附加依赖项;

还有一种方法是直接将静态库文件加载到项目工程中。


  1. 1.在使用标准库时,通常不用显式地链接静态库,因为标准库已经在编译器中链接;
  2. 2.头文件中的函数 声明和类型声明(通常这些库函数在标准静态库中定义),是为了让编译器直到函数的签名和类型信息,以便在编译时进行类型检查和符号解析;
  3. 3.静态库的连接通常适用于用户自定义的库或自三方库。

例:

#include<winsock2.h>
#praga comment(lib,"ws2_32.lib)


三、windows平台

Windows 操作系统上常用的 C 语言库包括:


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


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

Kernel32.lib 和 Kernel32.dll:提供了与系统核心功能相关的函数,如进程管理、线程管理、文件操作、时间和日期等。

User32.lib 和 User32.dll:提供了与用户界面相关的函数,如窗口创建、消息处理、输入处理、绘图等。

Gdi32.lib 和 Gdi32.dll:提供了图形设备接口函数,用于绘制图形和处理图像。

Winsock2.lib 和 Ws2_32.dll:提供了与网络编程相关的函数和数据结构,用于进行网络通信。


3.其他库:除了 Windows API,还有许多其他的第三方库可以用于 Windows 平台的 C 语言开发,如开源的库、图形库、数据库访问库等。一些常见的库有:

OpenSSL:用于加密、解密和安全通信。

SQLite:用于嵌入式数据库操作。

zlib:用于压缩和解压缩数据。

libpng:用于处理 PNG 图像文件。

libxml2:用于处理 XML 数据。


常用头文件有:

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


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


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


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


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


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


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

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

四、Linux平台

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


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


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

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

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

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


3.动态链接库(Dynamic Linking Libraries):Linux 上许多库以动态链接库的形式存在,常见的动态链接库包括:

<libm.so>:数学库,提供了各种数学函数。

<libpthread.so>:线程库,提供了对 POSIX 线程的支持。

<libdl.so>:动态加载库,用于在运行时动态加载其他库。


4.开源库:Linux 是开源操作系统,拥有丰富的开源库可以供开发者使用。一些常见的开源库有:

OpenSSL:用于加密、解密和安全通信。

SQLite:用于嵌入式数据库操作。

zlib:用于压缩和解压缩数据。

libpng:用于处理 PNG 图像文件。

libxml2:用于处理 XML 数据。


在 Linux 系统上独有的一些 C 语言头文件包括:

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

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

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

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

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

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

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

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

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

10.<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 中的函数和类型,您可以根据不同的本地化需求,调整程序的输出格式、日期时间格式、货币


相关文章
|
3月前
|
Linux 数据安全/隐私保护 Windows
Linux共享Windows目录
Linux共享Windows目录
|
3月前
|
安全 Linux vr&ar
Linux的动态库和静态库
Linux的动态库和静态库
|
3月前
|
Linux Windows
双系统安装:一键解锁电脑新境界,Windows与Linux并肩作战!
告别单一选择,拥抱无限可能!厌倦了单一操作系统的束缚吗?现在就打破常规,同时享受Windows的便捷与Linux的强大吧!🚀想象早晨用Windows高效办公,夜晚切换至Linux探索开源世界,是不是心动了?💖双系统安装就像赋予电脑双重人格,让一台机器拥有两种独立环境,自由切换如同拥有两台电脑!💰只需三步:规划分区、准备安装介质、安装Linux,即可轻松完成设置,立即体验双重身份带来的便利吧!💾💻
51 0
|
1月前
|
关系型数据库 MySQL Linux
Navicat 连接 Windows、Linux系统下的MySQL 各种错误,修改密码。
使用Navicat连接Windows和Linux系统下的MySQL时可能遇到的四种错误及其解决方法,包括错误代码2003、1045和2013,以及如何修改MySQL密码。
202 0
|
3月前
|
缓存 NoSQL Linux
【Azure Redis 缓存】Windows和Linux系统本地安装Redis, 加载dump.rdb中数据以及通过AOF日志文件追加数据
【Azure Redis 缓存】Windows和Linux系统本地安装Redis, 加载dump.rdb中数据以及通过AOF日志文件追加数据
128 1
【Azure Redis 缓存】Windows和Linux系统本地安装Redis, 加载dump.rdb中数据以及通过AOF日志文件追加数据
|
3月前
|
监控 机器人 Unix
GoLand——windows下如何编译Linux二进制文件
GoLand——windows下如何编译Linux二进制文件
52 1
GoLand——windows下如何编译Linux二进制文件
|
3月前
|
Unix Linux Ruby
在windows和linux上高效快捷地发布Dash应用
在windows和linux上高效快捷地发布Dash应用
|
3月前
|
Linux iOS开发 开发者
跨平台开发不再难:.NET Core如何让你的应用在Windows、Linux、macOS上自如游走?
【8月更文挑战第28天】本文提供了一份详尽的.NET跨平台开发指南,涵盖.NET Core简介、环境配置、项目结构、代码编写、依赖管理、构建与测试、部署及容器化等多个方面,帮助开发者掌握关键技术与最佳实践,充分利用.NET Core实现高效、便捷的跨平台应用开发与部署。
184 3
|
3月前
|
Ubuntu Linux 虚拟化
安装Windows Linux 子系统的方法:适用于windows 11 版本
本文提供了在Windows 11系统上安装Linux子系统(WSL)的详细步骤,包括启用子系统和虚拟化功能、从Microsoft Store安装Linux发行版、设置WSL默认版本、安装WSL2补丁,以及完成Ubuntu的首次安装设置。
882 2
|
2月前
|
Linux 开发者 Python
从Windows到Linux,Python系统调用如何让代码飞翔🚀
【9月更文挑战第10天】在编程领域,跨越不同操作系统的障碍是常见挑战。Python凭借其“编写一次,到处运行”的理念,显著简化了这一过程。通过os、subprocess、shutil等标准库模块,Python提供了统一的接口,自动处理底层差异,使代码在Windows和Linux上无缝运行。例如,`open`函数在不同系统中以相同方式操作文件,而`subprocess`模块则能一致地执行系统命令。此外,第三方库如psutil进一步增强了跨平台能力,使开发者能够轻松编写高效且易维护的代码。借助Python的强大系统调用功能,跨平台编程变得简单高效。
40 0